在下面所示的批处理文件上下文中测试errorlevel of TASKKILL的正确语法是什么?
: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我试图让我的批处理文件运行TASKKILL,然后测试结果。
如果结果是"INFO:没有使用指定条件运行的任务“。我需要批处理文件再次尝试TASKKILL。
如果结果是“成功:发送终止信号到.”。我需要批处理文件来关闭。
为了实现这一点,我使用了我学到的关于这里和这里的if语句、标签和gotos。
我怀疑我错误地使用了错误级别,因为不管TASKKILL做了什么,从批处理文件的角度来看,它的错误级别是0。一些类似帖子的答案使用%errorlevel%,另一些则使用errorlevel。无论我在批处理文件中使用哪种方法,它都会看到错误级别为0,而不管TASKKILL的实际结果如何。
发布于 2018-07-12 13:22:30
当您提供了筛选器( filter taskkill )时,ErrorLevel会清除ErrorLevel,这将导致不匹配!但是,当您只筛选图像名称(/IM)或进程ID (/PID)时,如果没有遇到匹配,则ErrorLevel将被设置为128。
因此,我将通过tasklist对进程进行预过滤,并将taskkill与其/PID过滤器一起使用:
: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发布于 2018-07-12 05:37:49
打开命令提示符窗口并运行if /?。输出帮助说明如何使用命令纠正错误级别的检查,如果使用自MS以来使用的语法if errorlevel X ...,并且在命令块内也是如此。
if %errorlevel% == 1 goto ShiftFocus在命令块中不工作,从(开始,以批量文件编写期望值中的匹配)结束,因为在执行命令块之前,Windows命令处理器将整个命令块中出现的所有%variable%替换为引用环境变量的值。在命令提示符窗口中运行没有@echo off的批处理文件时可以看到这一点。
还请参见使用Windows批处理文件使用多条命令的单行,说明如何使用if errorlevel X ...计算命令或应用程序的退出代码,或使用运算符&&和||。
也可以使用if errorlevel 1 if not errorlevel 2 goto ShiftFocus,这意味着退出代码大于或等于 1,但不大于或等于 2,如C、C++、C#、JavaScript等中的if ((errorlevel >= 1) && (errorlevel < 2)),如果希望对退出代码1进行显式测试,则不包括退出代码< code >D22。
还可以启用延迟膨胀并使用它,这可以通过命令将输出设置为在带有if !errorlevel! == 1 goto ShiftFocus的命令提示符窗口中运行set /?。但是,由于每个命令行的双重解析,使用延迟扩展可能会导致其他问题,使批处理文件的处理速度变慢,因此我并不推荐仅用于计算命令或应用程序的退出代码。
但是,真正的问题是,在Internet上,如果没有运行批处理文件,则应该根据有关说明跳转到ShiftFocus标签,这可以通过使用if errorlevel 128 goto ShiftFocus实现。
因此,整个批处理文件可以是:
: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"
%SystemRoot%\System32\timeout.exe /T 1 /NOBREAK >nul
:ShiftFocus
%SystemRoot%\System32\wscript.exe "C:\ProgramData\Schneider Electric\Citect SCADA 2016\User\1173051_SM_STP\Files\SendAltTab.vbs"
%SystemRoot%\System32\taskkill.exe /IM iexplore.exe /FI "WINDOWTITLE eq CloseMe - Internet Explorer"
if errorlevel 128 %SystemRoot%\System32\timeout.exe /T 1 /NOBREAK >nul & goto ShiftFocus
exit /B最好使用具有完整路径和文件扩展名的控制台应用程序(外部命令),使批处理文件独立于环境变量PATH和PATHEXT。
命令exit不应该在没有选项/B的情况下使用,因为它使得测试批处理文件在命令提示符窗口中运行非常困难,而不是双击它。详细信息请参见调试批处理文件。
在跳转到ShiftFocus并再次运行脚本之前,需要额外等待一秒钟,因为在循环中快速运行脚本和taskkill对我来说没有意义。
但是,由于阿希普解释的原因,这个批处理文件无法工作:TASKKILL不使用CatCat在使用filter选项/FI时编写的值128退出,并且没有运行与过滤器匹配的进程。
针对TASKKILL这种怪癖,阿希普发布了一个独立于语言的解决方案。
依赖于语言的解决方案将使用此批处理文件:
: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"
%SystemRoot%\System32\timeout.exe /T 1 /NOBREAK >nul
:ShiftFocus
%SystemRoot%\System32\wscript.exe "C:\ProgramData\Schneider Electric\Citect SCADA 2016\User\1173051_SM_STP\Files\SendAltTab.vbs"
for /F "delims=:" %%I in ('%SystemRoot%\System32\taskkill.exe /IM iexplore.exe /FI "WINDOWTITLE eq CloseMe - Internet Explorer"') do if "%%I" == "INFO" %SystemRoot%\System32\timeout.exe /T 1 /NOBREAK >nul & goto ShiftFocus
exit /BTASKKILL命令行由FOR在以cmd /C为后台启动的单独命令过程中执行。TASKKILL在这个后台命令过程中处理STDOUT的行输出由FOR捕获。然后,使用冒号作为分隔符,将捕获的行拆分为子字符串。直到第一个冒号的字符串分配给循环变量I。这个字符串在这里依赖于INFO或SUCCESS。在INFO中,没有发现带有窗口标题CloseMe - Internet Explorer的Internet实例,导致1秒后跳转到ShiftFocus,并再次运行VBScript和TASKKILL。
如果批处理文件应该运行在Windows Vista的任何Windows机器上,或者Windows语言独立于以后的Windows版本,则不应使用此Windows语言依赖解决方案。
发布于 2018-07-12 00:59:50
taskkill /f /im wscript.exe
echo %errorlevel%
pause%errorlevel%是
0代表成功 1用于拒绝访问 128无杀伤力
https://stackoverflow.com/questions/51295176
复制相似问题