‘taskkill’ und ‘handle’

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax