Windows 用于测试TASKKILL'的语法;错误级别

Windows 用于测试TASKKILL'的语法;错误级别,windows,batch-file,cmd,taskkill,tasklist,Windows,Batch File,Cmd,Taskkill,Tasklist,在下面显示的批处理文件的上下文中测试TASKKILL的errorlevel的正确语法是什么 :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.htm

在下面显示的批处理文件的上下文中测试
TASKKILL
errorlevel
的正确语法是什么

: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:No tasks running with the specified criteria.”,我需要批处理文件再次尝试
TASKKILL

如果结果是“成功:向…发送终止信号”,我需要关闭批处理文件

为了实现这一点,我使用了if语句、标签和goto,这是我在和中了解到的

我怀疑我使用了错误的错误级别,因为无论
TASKKILL
做什么,从批处理文件的角度来看,它的错误级别都是0。类似帖子的一些答案使用了
%errorlevel%
,其他答案使用了
errorlevel
。无论我在批处理文件中使用哪个,它都会看到错误级别为0,而不管
TASKKILL
的实际结果如何

taskkill /f /im wscript.exe
echo %errorlevel%
pause
%errorlevel%

0代表成功

1表示访问被拒绝

没什么好杀的


打开命令提示窗口并运行
如果/?
。输出帮助说明如何使用语法
IF errorlevel X…
在MS-DOS之后以及在命令块内使用命令IF纠正检查错误级别

如果%errorlevel%==1转到移位焦点
在以
开头的命令块中不起作用(
以匹配的
结尾)
作为批处理文件编写的初学者,由于Windows命令处理器在执行命令块之前,将整个命令块中出现的所有
%variable%
替换为引用的环境变量的值。在命令提示符窗口中运行批处理文件时,如果没有
@echo off
,则可以看到这一点

另请参见解释如何使用
if errorlevel X…
或使用操作符
&&
|
计算命令或应用程序的退出代码

>如果错误级别为2,如果没有错误级别2,则转到代码> <代码> >这意味着退出代码<强>大于或等于<强> >代码> 1 <代码>,但是<强>不大于或等于<强> >代码> 2 < /代码>,即如<代码>((ErrRealSe>=1)& &(ErrRealSe< 2))< /Code > C、C++、Cype、JavaScript等,如果需要对退出代码进行明确测试,则需要排除退出代码

128

在命令提示窗口中使用
if!运行
SET/?
时,也可以通过命令SET输出来启用和使用它!错误级别!==1转到移位焦点
。但是,我并不推荐使用延迟扩展,因为延迟扩展可能会导致其他问题,并由于对每个命令行进行双重解析而使批处理文件处理速度变慢,因为它仅用于评估命令或应用程序的退出代码

然而,真正的问题是,根据所讨论的解释,在未运行批处理文件的Internet Explorer上,应该跳转到标签
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

如果没有选项
/B
,则不应使用命令
exit
,因为在命令提示窗口中运行批处理文件而不是双击它会使测试变得非常困难。有关详细信息,请参阅

在跳转到
ShiftFocus
并再次运行脚本之前,需要额外等待一秒钟,因为在循环中快速运行脚本和
taskkill
,对我来说没有意义

但此批处理文件不起作用,原因如下:TASKKILL没有使用筛选器选项
/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 /B
TASKKILL命令行由FOR在后台以
cmd/C
启动的单独命令过程中执行。TASKKILL在此后台命令过程中处理STDOUT的行输出由FOR捕获。然后使用冒号作为分隔符将捕获的行拆分为子字符串。直到第一个冒号的字符串被分配给循环变量
I
。此字符串取决于语言
INFO
SUCCESS
。在
INFO
的情况下,未找到窗口标题为
CloseMe-internetexplorer
的Internet Explorer实例,导致在1秒后跳转到
ShiftFocus
,并再次运行VBScript和TASKKILL

如果批处理文件应在任何具有Windows Vista或更高版本的Windows机器上运行,且不依赖于Windows语言,则不应使用此Windows语言相关解决方案。

如果您提供了导致不匹配的筛选器
/FI
,则
taskkill
将清除
ErrorLevel
!但是,当您仅筛选图像名称(
/IM
)或进程ID(
/PID
)时,如果未遇到匹配项,
ErrorLevel
将设置为
128

因此,我将通过
tasklist
对进程进行预过滤,并将
taskkill
与其
/PID
过滤器一起使用:

:循环
rem//建立较短的等待时间,以避免处理器负载过重:
>努尔时间
:ShiftFocus
...
TASKKILL /IM iexplore.exe /FI "WINDOWTITLE eq CloseMe - Internet Explorer" | find "SUCCESS:" && goto :eof
goto :ShiftFocus
:ShiftFocus
...
TASKKILL /IM iexplore.exe /FI "WINDOWTITLE eq CloseMe - Internet Explorer" | find "No tasks running" && goto :ShiftFocus