0

由于尚未确定的原因,start /b中的/b开关导致taskkill无法找到第一个实例:

INFO: No tasks running with the specified criteria

这是相关代码的一个简单示例(有/b并且不起作用)。复制代码并粘贴到记事本中并保存为批处理文件。它将使用 cmd 开关“/k”重新启动,然后它将创建第二个实例,然后第二个实例将尝试结束第一个实例。如果需要,可以在此处找到原始脚本。

@prompt :
%zero%@set zero=::&start /b "" "cmd" /k "%~dpnx0"&goto :eof

%first%@TITLE First Instance
%first%@set first=::&start "" cmd /C "%~dpnx0"&goto :waiting

taskkill /F /FI "WINDOWTITLE eq First Instance"
taskkill /F /FI "WINDOWTITLE eq Administrator:  First Instance"

:waiting
pause>nul

这是没有/b开关的相同示例。这是两者之间的唯一区别。它可以正常工作:

@prompt :
%zero%@set zero=::&start "" "cmd" /k "%~dpnx0"&goto :eof

%first%@TITLE First Instance
%first%@set first=::&start "" cmd /C "%~dpnx0"&goto :waiting

taskkill /F /FI "WINDOWTITLE eq First Instance"
taskkill /F /FI "WINDOWTITLE eq Administrator:  First Instance"

:waiting
pause>nul

重申我的问题:如何让 taskkill 与 start 的/b开关一起工作?解释为什么它不能按原样工作也很好。

4

1 回答 1

1
@ECHO OFF
SETLOCAL
@prompt :
%zero%@set zero=::&start "Zeroth instance" "cmd" /k "%~dpnx0"&pause&goto :eof
ECHO Maybe CHANGE TITLE...
pause
%first%@TITLE First Instance
%first%@set first=::&start "Second instance" cmd /C "%~dpnx0"&goto :waiting
ECHO got here-------------
pause
taskkill /F /FI "WINDOWTITLE eq First Instance"
taskkill /F /FI "WINDOWTITLE eq Administrator:  First Instance"

:waiting
ECHO waiting...
PAUSE
exit
GOTO :EOF

带有大量回声和停顿的细微变化......

如果你使用上面的代码运行一个额外的会话,你会发现,当相应的接收到响应tasklist /v|find /i "cmd"时,窗口标题“Zeroth instance”将更改为“First instance” 。pause允许“第二个实例to reach thetaskkill s will close theZeroth/First”窗口,如果任一新窗口到达退出语句,则终止该实例。一切都很好,正如预期的那样。使用附加会话,您可以看到输入的各个阶段。

如果您重新引入/b开关,则实例不再有自己的窗口,因此它没有的窗口不能有标题。您可以使用附加会话看到这一点。现在 - 让那个特定的会话终止有点像游戏......不确定start /b与交互式批处理玩得很好......

于 2013-12-28T08:01:43.820 回答