Wie kann ich feststellen, welcher Prozess "explorer.exe" der Hauptprozess ist?

13

Ich habe eine Batch-Datei, die einige Registrierungsdateien ändert und dann explorer.exe neu startet, damit sie wirksam werden. Ich benutze die Befehle

taskkill /f /im explorer.exe
explorer.exe

Dadurch werden natürlich alle explorer.exe-Prozesse abgebrochen, einschließlich der Explorer-Fenster, die ich geöffnet habe. (Natürlich benutze ich die Option zu Launch folder windows in a separate process.)

Kann ich auf irgendeine Weise feststellen, welche Instanz von explorer.exe die Hauptinstanz ist, und töten Sie diese einfach?

HodofHod
quelle
Wenn Sie die main explorer.exe beenden, werden wahrscheinlich nur alle anderen beendet, da die Ausführung davon abhängt.
Cutrightjm
1
@ekaj Tut es nicht. Ich kann es manuell machen. Jedes Fenster ist ein unabhängiger Prozess.
HodofHod
Ich bin daran interessiert, einen zuverlässigen Weg zu finden, um auch die primäre (mit dem Desktop verbundene) explorer.exeInstanz zu bestimmen , aber aus dem entgegengesetzten Grund. Ich finde es ärgerlich, dass gespawnte explorer.exeProzesse nicht immer beendet werden, wenn alle zugehörigen Fenster geschlossen werden. Ich benutze den Task-Manager, um sie zu töten, und neige dazu, mich auf die Tatsache zu verlassen, dass die gespawnten Instanzen normalerweise (aus irgendeinem Grund) auf hohe Priorität gesetzt sind. Das funktioniert einwandfrei, aber wenn ich es aus offensichtlichen Gründen auf "normal" gesetzt habe, besteht die Gefahr, dass der primäre Prozess versehentlich abgebrochen wird.
Synetech
@Synetech Die Lösung dafür ist taskkill /f /im explorer.exe /fi "windowtitle ne N/A". Aus irgendeinem Grund funktioniert das Kopieren / Einfügen in die cmd-Eingabeaufforderung nicht. Sie müssen es von Hand eingeben. Ich habe keine Batch-Datei ausprobiert.
HodofHod
1
Sie haben das Problem in einen einfachen und einen unmöglichen Teil aufgeteilt, den einfachen Teil gelöst und bitten jetzt um Hilfe bei dem unmöglichen Teil. Es ist sehr wahrscheinlich, dass der "einfache" Teil der Lösung nicht korrekt ist (z. B. könnte das, was Sie versuchen, mit einer Gruppenrichtlinie erreicht werden). Daher wäre es schön, wenn Ihre Frage das ursprüngliche Problem enthält, das Sie zu lösen versuchen . Das Beenden von Prozessen, die Ihnen nicht gehören, ist selten richtig.
Simon Richter

Antworten:

9

Fenstertitelbasierter Ansatz

@ Techie007 schlug vor , die explorer.exemit Fenstertitel zu töten N/A.

Befehl

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

Wie es funktioniert

  • tasklist /nh /v /fi "imagename eq explorer.exe"Listet alle Prozesse mit Bildnamen ausführlich auf explorer.exe.

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

    ausführt COMMAND1. Für jede Ausgabezeile werden die Variablen %%psowie %%qdas zweite und zehnte "Token" (durch Leerzeichen begrenzt) gesetzt und ausgeführt COMMAND2.

    Im Falle von taskkill /v, enthält %%p nun die PID und %%qden (Anfangs-) Fenstertitel.

  • if "%%q"=="N/A" taskkill /f /pid %%pprüft ob der Fenstertitel ist N/A.

    In diesem Fall wird der Vorgang mit abgebrochen taskkill.

Memory Usage Based Approach

@Syntech wies darauf hin, dass dies für Windows Explorer unzuverlässig ist, aber in Programmen weist der Hauptprozess immer die höchste Speichernutzung auf.

Befehl

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

Wie es funktioniert

  • tasklist /nh /fi "imagename eq explorer.exe"listet alle Prozesse mit Bildnamen auf explorer.exe.

  • sort /+65 sortiert die vorherige Ausgabe ab dem 65. Zeichen (wo die Mem-Verwendung beginnt).

  • for /f "tokens=2" %%p in ('COMMAND') do @set explorerpid=%%pSetzt explorerpidauf den zweiten ( tokens=2) Eingang - durch Leerzeichen getrennt - jeder Zeile des Ausgangs von COMMAND, der die entsprechende PID ist.

  • Da tasklistdie Ausgabe sortiert wurde, wird explorerpiddie beanspruchte PID gespeichert und taskkillder Vorgang abgebrochen.

Dennis
quelle
Vielen Dank! Aber aus irgendeinem Grund funktioniert das bei mir noch nicht. Ich arbeite daran, ob ich es irgendwie ändern kann, damit es funktioniert.
HodofHod
1
@Dennis, > um explorerpid auf die PID der explorer.exe mit der höchsten Speichernutzung einzustellen. Dies sollte der zuverlässigste Weg sein, um den Hauptprozess zu bestimmen. Nein, nicht richtig. Öffnen Sie einen neuen Fensterprozess (z. B. über eine Verknüpfung), navigieren Sie zu einem Ordner mit vielen Bildern und zeigen Sie sie in der Miniaturansicht an. Der neue Prozess überholt schnell den ursprünglichen bei der Speichernutzung. > Nun, Sie haben nicht erwähnt, dass Sie nicht die Standardkonfiguration verwenden. Die Frage ist: Wie kann ich feststellen, welcher "explorer.exe" -Prozess der wichtigste ist? Wie könnte das sonst ein Problem sein?
Synetech
Sowohl der Fensteransatz als auch der Speicheransatz funktionieren jetzt. Ich denke, ich werde mit Fenster gehen - scheint zuverlässiger. Vielen Dank!
HodofHod
3

Vielleicht können Sie den Explorer anweisen, den Pfad in der Titelleiste anzuzeigen und ihn dann mithilfe des WINDOWTITLEFilters zu beenden.

  • Öffnen Sie den Explorer
  • Drücken Sie Alt
  • Klicken Sie auf "Extras (Menüpunkt)"
  • Klicken Sie auf "Ordneroptionen ... (Menüpunkt)"
  • Klicken Sie unter "Ordneroptionen" auf "Ansicht (Seitenregisterkarte)".
  • Option Auswählen durch Klicken unter "Ordneroptionen" die Option "Vollständigen Pfad in der Titelleiste anzeigen (nur klassisches Design)"
  • Klicken Sie auf "Übernehmen" -> "OK"

Der Pfad wird in der Titelleiste des Explorers nicht mit den "nicht klassischen" Themen angezeigt, ist aber (jetzt) ​​dort; es ist einfach nicht sichtbar.

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

Möglicherweise müssen Sie vorübergehend zu einem klassischen Thema wechseln, um den Pfad / Titel für die Explorer-Instanz zu bestimmen, die Sie neu starten möchten.

Nicht 100% narrensicher, aber alle Explorer-Fenster, die diesen (Teil-) Pfad nicht im Titel haben, wären zumindest sicher. :)

bearbeiten:

Da Sie die Datei mit dem Titel "N / A" auswählen möchten, müssen Sie wahrscheinlich eine Batch-Datei verwenden, um die Ergebnisse einer TASKLIST zu token und diese Token-Ergebnisse zu verwenden, um TASKKIL nach PID zu töten.

Ich habe eine Antwort auf StackOverflow.com gefunden, die dies anspricht:

Von Frage Taskkill einen unbenannten Prozess? Ist diese Antwort, die diese Beispiel-Batch-Datei enthält:

@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
)

Sie sollten den Befehl 'TASKLIST / V' so ändern, dass er spezifischer für Explorer.exe und dergleichen ist, aber er sollte Ihnen einen guten Ausgangspunkt bieten.

ƬᴇcƬᴇιʜ007
quelle
Der Prozess, den ich beenden möchte, ist der wichtigste. tasklist /fi "imagename eq explorer.exe" /v /fo listsagt mir, dass sein Fenstertitel "N / A" ist. Leider funktioniert "windowtitle eq nv" nicht. Irgendwelche Ideen?
HodofHod
Ahhhhhh. Erwischt. Ich habe auf StackOverflow eine Antwort darauf gefunden. Ich werde die Antwort mit den relevanten Bits hier mit einem Link aktualisieren.
ƬᴇcƬᴇιᴇ007
Ich sehe immer noch nicht, wie das funktionieren würde. Was ist, wenn kein anderes geöffnetes Explorer-Fenster als der Desktop vorhanden ist?
Synetech
1

Beenden Sie den Prozess mit der niedrigsten PID (Prozess-ID). Es wäre zuerst gestartet worden, da die Prozesse fortlaufend nummeriert werden.

Mythrillisch
quelle
+1 Dies würde zum ersten Mal funktionieren, wenn die Batch-Datei ausgeführt wird. Da jedoch explorer.exe neu gestartet wird, weist der neue "Haupt" -Prozess eine höhere PID auf. Gibt es eine andere Art und Weise?
HodofHod
Das ist wahr. Sie können jedoch einfach ausgeben tasklist | find /f "explorer"und fragen und dann (mit Benutzereingabe) fragen, welche PID die niedrigste ist, die zu töten ist.
Mythrillic
@HodofHod: Der zuverlässigste Weg wäre, den Prozess mit der höchsten Speichernutzung auszuwählen. Wenn Sie MinGW ( sed, awkusw.) verwenden können, ist dies recht einfach und automatisch möglich. Wenn nicht, ist die Benutzereingabe möglicherweise die beste Wahl.
Dennis
@ Adam543i, > Beenden Sie den Prozess mit der niedrigsten PID (Prozess-ID). Es wäre zuerst gestartet worden, da die Prozesse fortlaufend nummeriert werden. Von welcher Windows-Version sprechen Sie? Das ist einfach nicht wahr. Abgesehen von der zufälligen PID-Sicherheitsfunktion erinnere ich mich auf OldNewThing an PIDs, die in Intervallen (von vier oder 16 oder so) zugewiesen wurden. Tatsache ist, dass die Verwendung von PIDs (auch relativen) einfach zu unzuverlässig ist.
Synetech
@Dennis, > Der zuverlässigste Weg wäre, den Prozess mit der höchsten Speichernutzung auszuwählen. Nee. Überhaupt nicht. Es ist extrem einfach für einen Spawn-Prozess, eine höhere Speichernutzung zu haben.
Synetech