Aufgrund eines aktuellen Anwendungsfalls habe ich mir mal überlegt, wie man einfach einen Prozess beenden kann, der auf eine bestimmte Datei zugreift, um diese dann löschen zu können.
Normalerweise nimmt der versierte Windowsnutzer dafür “taskkill.exe”. Mit Schalter “/pid” und der Prozess-ID des zu beendenden Prozesses ist das kein Problem. Auch wenn die PID nicht bekannt ist, kann mit Schalter “/im” der Name der ausgeführten Datei übergeben werden.
Im konkreten Fall ist der zu beendende Prozess aber “svchost.exe”, der unter Windows standardmäßig mehrfach läuft mit unterschiedlichen PIDs. Schalter “/im” fällt also schonmal weg, da beim Beenden aller svchost-Prozesse Windows heruntergefahren wird. Also nehmen wir Schalter “/pid”.
Wie bekommen wir nun aber die PID genau des svchost-Prozesses heraus, der auf unsere Datei zugreift? Die Antwort gibt uns Mark Russinovich von SysInternals, dessen kleines Kommandozeilenprogramm “handle” genau dafür geschrieben wurde. Mit ein wenig Kenntnis des “for”-Befehls unter Windows basteln wir uns nun folgende Zeile zusammen:
for /F "tokens=2,3" %i in ('handle -a <strong>C:\WINDOWS\...\INDEX.MAP</strong>^|find "pid"') do taskkill /pid %j /f
Der angegebene Dateiname bezeichnet unsere zu löschende Datei, auf die der zu beendende Prozess zugreift. Beim Einsatz in einer Batch Datei müssen nur noch die Prozentzeichen doppelt geschrieben werden (%i → %%i). Diese Zeile beendet dann alle Prozesse, die auf die angegebene Datei zugreifen.
Der for-Befehl führt den in Klammern angegebenen Befehl aus, also “handle”, dessen Ausgabe nach “pid” durchsucht wird. Dieser Befehl gibt eine Zeile zurück:
svchost.exe pid: 1100 BCC: C:\WINDOWS\...\INDEX.MAP
Und so funktioniert’s:
“for” erkennt die so genannten “Tokens” anhand der Leerzeichen zwischen den Worten: jedes Leerzeichen → neuer Token (Tip: einfach mal “for /?” eingeben ;)). Der zweite Token ist unsere gesuchte PID, die am Ende der Befehlszeile über “%j” weiterverarbeitet werden kann und in diesem Fall direkt dem “taskkill”-Befehl übergeben wird.
Und schwupps, schon ist das Problem gelöst! :DD