Search code examples
windowsbatch-filecmdtaskkilltasklist

syntax for testing TASKKILL's errorlevel


What is the correct syntax for testing the errorlevel of TASKKILL in the context of the batch file shown below?

:Launch
   start "CloseMe" "C:\Program Files\internet explorer\iexplore.exe" "file://C:\ProgramData\Schneider Electric\Citect SCADA 2016\User\1173051_SM_STP\Files\Stony Mountain Institute Lift Station.html"
   TIMEOUT 1 & 
:ShiftFocus
   wscript "C:\ProgramData\Schneider Electric\Citect SCADA 2016\User\1173051_SM_STP\Files\SendAltTab.vbs"
   TASKKILL /IM iexplore.exe /FI "WINDOWTITLE eq CloseMe - Internet Explorer"
   if %errorlevel% == 1 GOTO ShiftFocus
:End
exit

I'm trying to get my batch file to run TASKKILL then test the result.

If the result is "INFO: No tasks running with the specified criteria." I need the batch file to try TASKKILL again.

If the result is "SUCCESS: Sent termination signal to ... ." I need the batch file to close.

To accomplish this I'm using if statements, labels and gotos which I learned about here and here.

I'm suspect I'm using errorlevel incorrectly because no matter what TASKKILL does its errorlevel, from my batch files perspective, is 0. Some answers to similar posts are using %errorlevel% and others are using errorlevel. No matter which I use in my batch file its sees an error level of 0 regardless of the actual result of TASKKILL.


Solution

  • The taskkill clears ErrorLevel when you have provided a filter /FI which results in no match! However, when you only filter for image names (/IM) or process IDs (/PID), ErrorLevel becomes set to 128 if no matches have been encountered.

    Therefore I would prefilter the processes by tasklist and use taskkill together with its /PID filter:

    :LOOP
    rem // Establish a short wait time to not heavily load the processor:
    > nul timeout /T 1 /NOBREAK
    rem // Prefilter processes and retrieve the PID of the applicable one:
    set "PID=" & for /F "tokens=1* delims=:" %%T in ('
        tasklist /FI "IMAGENAME eq iexplore.exe" /FI "WINDOWTITLE eq CloseMe - Internet Explorer" /FO LIST
    ') do if "%%T"=="PID" for /F %%W in ("%%U") do set "PID=%%W"
    rem // Loop back in case no PID could be retrieved:
    if not defined PID goto :LOOP
    rem // Try to kill the task and loop back in case of failure:
    taskkill /PID %PID% || goto :LOOP