% переменных% раскрываются перед выполнением строки, поэтому% errorlevel% расширится до некоторого старого значения.(Тот факт, что код после && выполняется вообще, указывает на то, что команда вернула 0)
Возможны следующие варианты:
- Использовать
%errorlevel%
или более правильный 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