Cmd 为什么这两种情况下的错误级别存在差异?

Cmd 为什么这两种情况下的错误级别存在差异?,cmd,taskkill,errorlevel,Cmd,Taskkill,Errorlevel,情景1: calc.exe正在运行 taskkill /IM calc.exe /f | if "%ERRORLEVEL%"=="0" taskkill /IM calc.exe /f taskkill /IM calc.exe /f 这将1设置为errorlevel 场景2:calc.exe未运行 taskkill /IM calc.exe /f | if "%ERRORLEVEL%"=="0" taskkill /IM calc.exe /f taskkill /IM ca

情景1: calc.exe正在运行

taskkill /IM calc.exe /f | if "%ERRORLEVEL%"=="0" taskkill /IM calc.exe /f  
taskkill /IM calc.exe /f  
这将1设置为errorlevel

场景2:calc.exe未运行

taskkill /IM calc.exe /f | if "%ERRORLEVEL%"=="0" taskkill /IM calc.exe /f  
taskkill /IM calc.exe /f  
这将128设置为错误级别


有人能解释一下为什么会发生这种情况,以及在第一个场景中是否有一种方法可以将errorlevel设置为128以及与第二个场景类似?

我尝试了
taskkill
任务列表
查找
。所有返回的错误级别都不一致。这使得不可能可靠地使用errorlevel来了解进程是否正在运行或是否确实已终止。但是,我确实找到了一种不使用errorlevel的方法:

@echo off

setlocal ENABLEDELAYEDEXPANSION

set _i=0
for /f "delims=" %%i in ('tasklist ^| find /i "%1"') do set /a _i+=1

if !_i! GTR 0 (

  echo Found !_i! instances of %1.  Terminating all instances...
  taskkill /im "%1" /f > nul 2>&1

  echo Verifying that %1 has been terminated...
  set _i=0
  for /f "delims=" %%i in ('tasklist ^| find /i "%1"') do set /a _i+=1

  if !_i! EQU 0 (
    echo %1 was successfully terminated.
  ) else (
    echo %1 was *not* teriminated.  There are still !_i! instances running.
  )

) else (
  echo %1 is not running.
)

set _i=
endlocal
您需要启用延迟扩展,以便正确计算
\u i
变量

用于…%%的
i
代码集行
\u i
等于进程在内存中的实例数。由于
find
不会返回一致的错误级别,因此我们可以使用此技术可靠地找到它在内存中的#次