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 /NH
wird 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 %%x
zutreffen 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.exe
Funktioniert 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 %%x
stellen Sie fest, dass %%x nur das erste Wort des Prozesses enthält, in diesem Beispiel My
von 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 My
und Process.exe
, die Sie dann kombinieren und mit der ursprünglichen EXE
Variable 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