% variables% expand to line execution, so% errorlevel% will expand to some old value. (The fact that the code after && executes in general is your key, which the 0 command returns)
The following options are possible:
- Use
%errorlevel% or more correct IF errorlevel 1 ... on the next line - Call
setlocal ENABLEDELAYEDEXPANSION first and then use !errorlevel!
Edit: I think tasklist is a mistake and / or stupid when it comes to exit codes, I wrote code that doesn't use exit code at all:
@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)
Run it as test.cmd SOTEST and it prints:
calc.exe:4852 is running dummy.exe:666 is NOT running
source share