%variables% は行を実行する前に展開されるため、%errorlevel% は古い値に展開されます。( && の後のコードがまったく実行されるという事実は、コマンドが 0 を返したことの手がかりです)
オプションは次のとおりです。
- 次の行で
%errorlevel%
orを使用してくださいIF errorlevel 1 ...
- 電話
setlocal ENABLEDELAYEDEXPANSION
してから使う!errorlevel!
編集:
タスクリストは、終了コードに関してはバグがあるか愚かだと思います。終了コードをまったく使用しないコードをいくつか書きました:
@echo off
if "%~1"=="SOTEST" (
start calc
ping -n 2 localhost >nul
for /F "tokens=1,2 skip=3" %%A in ('tasklist /FI "IMAGENAME eq calc.exe"') do (
call "%~0" %%A %%B
)
call "%~0" dummy.exe 666
goto :EOF
)
goto main
:IsTaskRunning
setlocal ENABLEEXTENSIONS&set _r=0
>nul 2>&1 (for /F "tokens=1,2" %%A in ('tasklist /FO LIST %*') do (
if /I "%%~A"=="PID:" set _r=1
))
endlocal&set IsTaskRunning=%_r%&goto :EOF
:main
call :IsTaskRunning /FI "USERNAME eq %USERDOMAIN%\%USERNAME%" /FI "IMAGENAME eq %1" /FI "PID eq %2"
if %IsTaskRunning% gtr 0 (echo.%1:%2 is running) else (echo.%1:%2 is NOT running)
test.cmd SOTEST として実行すると、次のように出力されます。
calc.exe:4852 is running
dummy.exe:666 is NOT running