Ich habe bereits vor einigen Monaten mal über die Erkennung von laufenden Prozessen via Batch geschrieben. Damals habe ich diese Erkennung in einfachen oder komplexeren If Else Blöcken verschachtelt. Ich habe nun gemerkt, dass dies zu Problemen und falschen Erkennungen führen kann!
Daher hier das Update: If Else Verschachtelungen können zwar ein paar Zeilen sparen aber verfälschen Errorlevel Rückgaben! In If Else Blöcken würde ich keine Programmbefehle schreiben, die mit dem Errorlevel arbeiten sollen. Lieber mit einigen gotos arbeiten.
Hier ein Beispiel:
REM Statt: if /i %action%==start-server ( tasklist |find /i "IQB_Server.exe" if not %errorlevel%==0 start IQB_Server.exe goto end ) REM folgenden Code verwenden: if /i %action%==start-server goto start-server :start-server tasklist |find /i "IQB_Server.exe" if not %errorlevel%==0 start IQB_Server.exe goto end REM Errorlevel in IF ELSE Blöcken können falsch sein!
Nochmal zum Erkennen von Prozessen via Batch: hier sind 3 verschiedene funktionierende Methoden:
REM %errorlevel% ist immer 0 wenn der Prozess existiert REM 1 wenn nicht gefunden REM am besten mit 'if not "%errorlevel%"=="0"' überprüfen REM Variante 1: tasklist | find /i "dropbox.exe" REM Variante 2: tasklist /FI "IMAGENAME eq dropbox.exe" 2>NUL | find /I /N "dropbox.exe">NUL REM beide NUL Umleitungen optional REM Variante 3: tasklist /nh /fi "imagename eq dropbox.exe" | find /i "dropbox.exe" >NUL REM letzte NUL Umleitung optional
English Version
A few months ago I already wrote a post about the detection of running processes with batch. In this post I used this detection code inside simple or more complex if-else block statements. I recently noticed possible false positives if doing so. Using %errorlevel% return codes inside if-else statements can lead to wrong return codes.
So, here’s the update: if else structures can save a few code lines but can also falsify errorlevel return codes! And since the detection of running processes rely on errorlevel returns you should use gotos instead of if else.
Here’s a code example:
REM instead of: if /i %action%==start-server ( tasklist |find /i "IQB_Server.exe" if not %errorlevel%==0 start IQB_Server.exe goto end ) REM use this code: if /i %action%==start-server goto start-server :start-server tasklist |find /i "IQB_Server.exe" if not %errorlevel%==0 start IQB_Server.exe goto end REM errorlevel return codes in if-else blocks may be wrong!
Here are 3 different working code examples for process detection:
REM %errorlevel% is always 0 if the process is running REM and 1 if it is not running REM best way is to check with 'if not "%errorlevel%"=="0"' REM code 1: tasklist | find /i "dropbox.exe" REM code 2: tasklist /FI "IMAGENAME eq dropbox.exe" 2>NUL | find /I /N "dropbox.exe">NUL REM both NUL redirections are optional REM code 3: tasklist /nh /fi "imagename eq dropbox.exe" | find /i "dropbox.exe" >NUL REM last NUL redirection is optional
REM Statt:
if /%%i %action%==start-server (
tasklist |find /i „IQB_Server.exe“
if not %errorlevel%==0 start IQB_Server.exe
goto end
)
REM folgenden Code verwenden:
if /%%i %action%==start-server goto start-server
:start-server
tasklist |find /i „IQB_Server.exe“
if not %errorlevel%==0 start IQB_Server.exe
goto end
So ist der Richtig
Hallo Jeffrey, wo ist der Unterschied zu meinem Code im Artikel?
if /%%i %action%==start-server