Come posso sapere quale processo "explorer.exe" è quello principale?


13

Ho un file batch che modifica alcuni file di registro e quindi riavvia explorer.exe in modo che abbiano effetto. Sto usando i comandi

taskkill /f /im explorer.exe
explorer.exe

Questo ovviamente uccide tutti i processi explorer.exe, comprese le finestre di explorer che ho aperto. (Ovviamente, sto usando l'opzione per Launch folder windows in a separate process.)

Esiste un modo per determinare quale istanza di explorer.exe è la principale e ucciderla?


Uccidere il explorer.exe principale probabilmente ucciderà tutti gli altri poiché dipendono da esso per l'esecuzione.
cutrightjm,

1
@ekaj Non lo fa. Sono in grado di farlo manualmente. Ogni finestra è un processo indipendente.
Hod - Monica's Army

Sono interessato a trovare un modo affidabile per determinare anche l' explorer.exeistanza primaria (associata al desktop) , ma per il motivo opposto. Trovo fastidioso che i explorer.exeprocessi generati non siano sempre usciti quando tutte le finestre associate sono chiuse. Uso Task Manager per ucciderli e tendo a fare affidamento sul fatto che le istanze generate di solito sono impostate su priorità alta (per qualche motivo). Funziona bene, ma se mi capita di averlo impostato alla normalità (per ovvi motivi), allora corro il rischio di uccidere accidentalmente il processo primario.
Synetech,

@Synetech La soluzione è taskkill /f /im explorer.exe /fi "windowtitle ne N/A". Per qualche motivo, copiare / incollare ciò nel prompt cmd non funziona; devi scriverlo a mano. Non ho provato un file batch.
Hod - Monica's Army l'

1
Hai diviso il problema in una parte facile e impossibile, hai risolto la parte facile e ora stai chiedendo aiuto per la parte impossibile. È molto probabile che la parte "facile" della soluzione non sia corretta (ad esempio, ciò che si sta tentando di fare potrebbe essere realizzato con una politica di gruppo), quindi sarebbe bello se la tua domanda includesse il problema originale che stai cercando di risolvere . I processi di uccisione che non ti appartengono raramente sono corretti.
Simon Richter,

Risposte:


9

Approccio basato sul titolo della finestra

@ techie007 ha suggerito di uccidere ilexplorer.exe titolo della finestra N/A.

Comando

for /f "tokens=2,10" %%p in ('tasklist /nh /v /fi "imagename eq explorer.exe"') do if "%%q"=="N/A" taskkill /f /pid %%p

Come funziona

  • tasklist /nh /v /fi "imagename eq explorer.exe"elenca in modo dettagliato tutti i processi con il nome dell'immagine explorer.exe.

  • for /f "tokens=2,10" %%p in ('COMMAND1') do COMMAND2

    esegue COMMAND1. Per ogni riga di output, imposta le variabili %%pe %%qsul secondo e decimo "token" (delimitato dallo spazio) ed esegue COMMAND2.

    Nel caso di taskkill /v, %%p ora contiene il PID e %%qil (inizio di) il titolo della finestra.

  • if "%%q"=="N/A" taskkill /f /pid %%pcontrolla se il titolo della finestra è N/A.

    In tal caso, termina il processo con taskkill.

Approccio basato sull'utilizzo della memoria

@Syntech ha sottolineato che questo non è affidabile per Windows Explorer, ma nei programmi il processo principale ha sempre il più alto utilizzo di memoria.

Comando

for /f "tokens=2" %%p in ('tasklist /nh /fi "imagename eq explorer.exe" ^| sort /+65') do @set explorerpid=%%p
taskkill /f /pid %explorerpid%

Come funziona

  • tasklist /nh /fi "imagename eq explorer.exe"elenca tutti i processi con il nome dell'immagine explorer.exe.

  • sort /+65 ordina l'output precedente a partire dal 65 ° carattere (dove inizia l'utilizzo del mem).

  • for /f "tokens=2" %%p in ('COMMAND') do @set explorerpid=%%pimposta explorerpidsul secondo ( tokens=2) input - delimitato da spazi - di ciascuna riga dell'output di COMMAND, che è il PID corrispondente.

  • Dal momento che tasklist's ouput è stato ordinato, explorerpiddetiene il PID rivendicato, e taskkilltermina il processo.


Grazie! Ma per qualche motivo non funziona ancora per me. Sto lavorando per vedere se posso modificarlo in qualche modo per farlo funzionare.
Hod - Monica's Army

1
@Dennis, > per impostare explorerpid sul PID di explorer.exe con il più alto utilizzo di memoria. Questo dovrebbe essere il modo più affidabile per determinare il processo principale. No non corretto. Apri una nuova finestra (ad es. Tramite una scorciatoia), vai a una cartella con molte immagini e visualizzale in modalità miniatura. Il nuovo processo supererà rapidamente quello originale nell'uso della memoria. > Bene, non hai detto che non stai usando la configurazione predefinita. La domanda è: come posso sapere quale processo "explorer.exe" è quello principale? In quale altro modo pensi che potrebbe essere un problema?
Synetech,

Sia l'approccio con finestra che l'approccio con la memoria ora funzionano. Penso che andrò con finestre - sembra più affidabile. Grazie mille!
Hod - Monica's Army

3

Forse puoi dire a Explorer di mostrare il percorso nella barra del titolo e quindi utilizzare il WINDOWTITLEfiltro per ucciderlo in base a quello?

  • Apri Explorer
  • stampa Alt
  • Fai clic su "Strumenti (voce di menu)"
  • Fai clic su "Opzioni cartella ... (voce di menu)"
  • Fai clic su "Visualizza (scheda pagina)" in "Opzioni cartella"
  • Fare clic per selezionare "Visualizza il percorso completo nella barra del titolo (solo tema classico)" in "Opzioni cartella"
  • Fai clic su "Applica" -> "OK"

Il percorso non verrà mostrato nella barra del titolo di Explorer con i temi "non classici", ma è (ora) lì; non è appena visibile.

taskkill /F /FI "WINDOWTITLE eq C:\PathToThing\RunningInExplorer\ToRestart*"

Potrebbe essere necessario passare temporaneamente a un tema classico per determinare quale sia il percorso / titolo per l'istanza di Explorer che si desidera riavviare.

Non sicuro al 100%, ma qualsiasi finestra di Explorer che non ha quel percorso (parziale) nel titolo sarebbe almeno sicura. :)

modificare:

Dato che vuoi prendere quello con il titolo "N / A", probabilmente dovrai usare un file batch in modo da poter tokenizzare i risultati di un TASKLIST e usare questi risultati token per usare TASKKIL per uccidere con PID.

Ho trovato una risposta a StackOverflow.com che risolve questo problema:

Dalla domanda Taskkill un processo senza titolo? è questa risposta che include questo file batch di esempio:

@echo off
SETLOCAL enabledelayedexpansion
for /f "tokens=*" %%a in ('TASKLIST /V') do (
  set s=%%a
  set p=!s:~27,5!
  set t=!s:~152,3!
  if '!t!'=='N/A' ECHO TASKKILL /PID !p! /T
)

Dovresti cambiare il comando 'TASKLIST / V' per essere più specifico di Explorer.exe e simili, ma dovrebbe darti un buon punto di partenza.


Il processo che voglio uccidere è quello principale. tasklist /fi "imagename eq explorer.exe" /v /fo listmi dice che il suo sottotitolo è "N / A". Sfortunatamente, "" windowtitle eq N / A "non funziona. Qualche idea?
Hod - Monica's Army

Ahhhhhh. Gotcha. Ho trovato una risposta a quella su StackOverflow, aggiornerò la risposta con i bit pertinenti qui con un link.
Ƭᴇcʜιᴇ007,

Ancora non vedo come funzionerebbe. Cosa succede se non ci sono finestre Explorer aperte diverse dal desktop?
Synetech,

1

Termina il processo con il PID (ID processo) più basso. Sarebbe stato avviato per primo, poiché i processi vengono numerati in sequenza.


+1 Funzionerebbe per la prima volta che viene eseguito il file batch, ma dal riavvio di explorer.exe, il nuovo processo "principale" avrà un PID più elevato. C'è un altro modo?
Hod - Monica's Army l'

Questo è vero. Tuttavia, potresti semplicemente emettere tasklist | find /f "explorer"e chiedere, quindi chiedi (con input dell'utente) qual è il PID più basso da uccidere.
Mitico

@HodofHod: il modo più affidabile sarebbe selezionare il processo con il più alto utilizzo di memoria. Se è possibile utilizzare MinGW ( sed, awk, ecc), che abbastanza facile da fare automaticamente. In caso contrario, l'input dell'utente potrebbe essere la scelta migliore.
Dennis,

@ Adam543i, > Termina il processo con il PID (ID processo) più basso. Sarebbe stato avviato per primo, poiché i processi vengono numerati in sequenza. Di quale versione di Windows stai parlando? Questo semplicemente non è vero. A parte la funzione di sicurezza PID casuale, ricordo qualcosa su OldNewThing sui PID assegnati a intervalli (di quattro o 16 o qualcosa del genere). Il fatto è che l'uso dei PID (anche quelli relativi) è troppo inaffidabile.
Synetech,

@Dennis, > Il modo più affidabile sarebbe selezionare il processo con il più alto utilizzo di memoria. No. Affatto. È estremamente facile per un processo generato avere un uso maggiore della memoria.
Synetech,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.