Search code examples
windowsbatch-fileerrorlevel

Errorlevel in a For loop (Windows batch)


I have the following windows batch code:

for %%i in (iidbms iigcc iigcd dmfacp dmfrcp rmcmd qwerty) do (
  tasklist | findstr /i %%i
  echo %errorlevel%
  if %errorlevel% == 0 (echo %%i ok process found %errorlevel%)
  if %errorlevel% == 1 (echo %%i no process found %errorlevel%)
)

But it doesn't work as I expect.

All the name processes iidbms, iigcc, iigcd, dmfacp, dmfrcp, rmcmd are real, and they are found, instead qwerty is an invented one and should not find it, so should print " no process found 1", but it doesn't, it always prints 0.

But what I have noted is that if I run the tasklist | findstr /i qwerty from the dos prompt, just after there is that the %errorlevel% = 1.

What sort of answer could be or better is?


Solution

  • IF ERRORLEVEL returns TRUE if the return code was equal to or higher than the specified errorlevel. In your example, since 0 is lower than 1, the first errorlevel statement will always be true if the actual error code is 0 or above. What you want is to test for errorlevel 1 first.

    E.g.:

    for %%i in (iidbms iigcc iigcd dmfacp dmfrcp rmcmd qwerty) do (
        tasklist | findstr /i %%i
        if errorlevel 0 if not errorlevel 1 echo process
        if errorlevel 1 if not errorlevel 2 echo process not found
    )
    

    Another issue is if you want to echo the actual errorlevel from within the for loop. Since variables are resolved before the start of the loop, echoing %errorlevel% will always echo 0. If you want to echo the value at the execution time, you need to modify the snippet like so:

    setlocal enabledelayedexpansion
    for %%i in (iidbms iigcc iigcd dmfacp dmfrcp rmcmd qwerty) do (
        tasklist | findstr /i %%i
        if errorlevel 0 if not errorlevel 1 echo %%i ok process found !errorlevel!
        if errorlevel 1 if not errorlevel 2 echo %%i no process found !errorlevel!
    )