Erkennen eines laufenden Prozesses mit Leerzeichen im Dateinamen

Erkennen eines laufenden Prozesses mit Leerzeichen im Dateinamen

Ich versuche, einen laufenden Prozess unter Windows 7 mithilfe einer Batchdatei zu erkennen. Prozesse ohne Leerzeichen funktionieren einwandfrei – z. B. notepad.exe. Ich verstehe nicht, warum das nicht funktioniert und wäre für jede Hilfe sehr dankbar.

CODE

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set "EXE=My Process.exe"

FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto ProcessFound 

goto ProcessNotFound

:ProcessFound
echo 1
goto END

:ProcessNotFound
echo 0
goto END

:END

ERWARTETES ERGEBNIS

C:\test.bat
1

TATSÄCHLICHE ERGEBNIS

C:\test.bat
'Process.exe' is not recognized as an internal or external command,
operable program or batch file.
0

Antwort1

Es gibt ein großes Problem mit Ihrem Code, und es hat nichts mit Leerzeichen im Prozessnamen zu tun.

Beim Ausführen tasklist /NHwird in jeder Zeile mehr als nur der Name des Prozesses zurückgegeben:

C:\temp>tasklist /nh

System Idle Process              0 Services                   0         24 K
System                           4 Services                   0      2,200 K
smss.exe                       400 Services                   0      1,232 K

Sie versuchen also, eine Zeile wie diese zu nehmen:

System Idle Process 0 Services 0 24 K(was %%xzutreffen würde) und prüfen Sie, ob es mit dem angegebenen Prozessnamen übereinstimmt (z. B.: System Idle Process).

Aufgrund der zusätzlichen Informationen in jeder Zeile wird es nie gleich sein, also müssen Sie einen Weg finden, eine Liste zu erhalten (oder weitere zu extrahieren).nurdie Prozessnamen.

Auch:

set "EXE=My Process.exe"braucht die Anführungszeichen nicht. Es weiß, dass alles in der Zeile nach dem Gleichheitszeichen der Wert ist, der der auf der linken Seite benannten Variable zugewiesen werden soll. set EXE=My Process.exeFunktioniert also auch mit den Leerzeichen einwandfrei.

Die Anführungszeichen um den Wertteil (wie in den Kommentaren vorgeschlagen) sind die übliche Methode, um Zeichenfolgen abzugrenzen. Da Set jedoch nicht typbasiert ist (es kann eine Zeichenfolge nicht von einer Zahl von einem Dreieck usw. unterscheiden), werden die Anführungszeichen eingeschlossen. Das set Filename="My Name"bedeutet, dass der Wert von Filename jetzt ist "My Name", einschließlich der Anführungszeichen. Dies kann zu Verwirrung führen/Dinge beschädigen, wenn Sie versuchen, es später zu verwenden (zwischen anderen Anführungszeichen in anderen Befehlen usw.).

Antwort2

Ich habe einen anderen Code gefunden, der funktioniert:

@echo off
tasklist /nh /fi "imagename eq My Process.exe" | find /i "My Process.exe" >nul && (
echo 1
) || (
echo 0
)

Antwort3

Ich bin darüber gestolpert und die Antworten haben mir in meinem Fall nicht geholfen, also habe ich einen Workaround für alle gefunden, die über einen ähnlichen Fall stolpern.

wie in anderen Antworten vor mir erwähnt, set "EXE=My Process.exe"funktioniert es auch ohne Anführungszeichen einwandfrei.

Das größere Problem besteht bei der For-Schleife. Wenn Sie sie wie beschrieben ausführen, FOR /F %%xstellen Sie fest, dass %%x nur das erste Wort des Prozesses enthält, in diesem Beispiel Myvon My Process.exe.

Um dies zu beheben, können Sie die Token- und Delims-Flags im FOR /F-Schleifenbefehl verwenden. Indem Sie die ersten beiden Zeichenfolgen als Token hinzufügen, erhalten Sie zwei Variablen Myund Process.exe, die Sie dann kombinieren und mit der ursprünglichen EXEVariable vergleichen.

Sollte ungefähr so ​​aussehen:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set EXE=My Process.exe

FOR /F "tokens=1,2 delims= " %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H" == "%EXE%" goto ProcessFound 

goto ProcessNotFound

:ProcessFound
echo 1
goto END

:ProcessNotFound
echo 0
goto END

:END

verwandte Informationen