场景 1:calc.exe 正在运行
taskkill /IM calc.exe /f | if "%ERRORLEVEL%"=="0" taskkill /IM calc.exe /f
这将 1 设置为错误级别。
场景 2:calc.exe 没有运行
taskkill /IM calc.exe /f
这将 128 设置为错误级别。
有人可以解释一下为什么会发生这种情况,以及是否有办法在第一种情况下将错误级别设为 128 以及类似于第二种情况?
场景 1:calc.exe 正在运行
taskkill /IM calc.exe /f | if "%ERRORLEVEL%"=="0" taskkill /IM calc.exe /f
这将 1 设置为错误级别。
场景 2:calc.exe 没有运行
taskkill /IM calc.exe /f
这将 128 设置为错误级别。
有人可以解释一下为什么会发生这种情况,以及是否有办法在第一种情况下将错误级别设为 128 以及类似于第二种情况?
我试验了taskkill
,tasklist
和find
。所有返回不一致的错误级别。这使得无法可靠地使用 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
您需要启用延迟扩展,以便_i
可以正确评估变量。
该for ... %%i
行代码集_i
等于进程在内存中的实例数。由于find
不返回一致的错误级别,我们可以使用此技术可靠地找到它在内存中的 # 次...