退出/ B 0不起作用

时间:2010-05-21 11:08:01

标签: batch-file cmd

我有以下问题:

我创建了一个批处理脚本,在那里调用自己(因为能够并行写入日志)。在脚本中,我启动另一个进程(如start startServer.bat),它启动一个java进程并一直保持打开状态。

在我的原始脚本中,我等待30秒,检查进程是否正在运行并执行:

exit /B 0

不幸的是,这不起作用,窗口显示正在评估退出/ B 0,但窗口仍然保持打开状态。当我用另一个进程关闭窗口(意味着在我的.bat中启动“子”进程)时,我的脚本继续运行。

所以:

scriptA.bat

-> in there I call: start startServer.bat
-> wait 30 seconds
-> check is server is started
-> exit /B 0
Process hangs up!

如果我将另一个脚本包裹起来,那是非常奇怪的,例如:

scriptB.bat

-> call scriptA.bat
-----> in there I call: start startServer.bat
-----> wait 30 seconds
-----> check if server is started
-----> exit /B 0
-> scriptA.bat continues without any hangup!

我也尝试了同样的退出0(没有/ B),同样的结果!在第一种情况下,它挂起,在第二种情况下,我的窗口按预期关闭......

你们之前有没有遇到过这样的问题,知道这里有什么问题吗? 流程挂断了!

3 个答案:

答案 0 :(得分:8)

这里有一个很好的解释退出批处理脚本的所有选项: http://www.robvanderwoude.com/exit.php

具体来说,从该页面开始:

  

DOS联机帮助(HELP EXIT)并未明确说明/ B参数退出当前脚本实例,该实例不一定与退出当前脚本相同。   即如果脚本在CALLed代码段中,则EXIT / B退出CALL,而不是脚本。

所以你绝对不希望在这种情况下exit /b 0。如果仅exit 0不起作用,请尝试GOTO:EOF

答案 1 :(得分:0)

我猜你的问题在于start命令。以下start /? help摘录可能指出问题:

  

<强>命令/程序

     

如果是内部cmd命令或   批处理文件然后是命令处理器   使用/ K开关运行到cmd.exe。   这意味着窗口将保留   命令运行后。

     

如果它不是内部cmd命令   或批处理文件然后它是一个程序和   将作为窗口运行   应用程序或控制台应用程序。

作为解决方案,您可以尝试修改启动命令,如下所示:

start "" cmd /c "startServer.bat"

答案 2 :(得分:0)

earlier answer中的Vicky非常好。

这里还有另外一些未记录的(或者至少是不清楚的)行为。

在您的问题中,您遇到的情况要复杂一些,但假设您要从原始文件中调用/启动一个批处理文件,并在被调用的批处理文件中使用exit /b 0,并期望 ERRORLEVEL 是原始文件。

原始

@echo off
start "" /b /wait cmd /c "startServer.bat"
if ERRORLEVEL 1 echo Exit code is one  & exit /b 1
if ERRORLEVEL 0 echo Exit code is zero & exit /b 0

子批处理文件

@echo off
exit /b 0

要使其正常工作,必须将start命令与某些选项一起使用。根据选项的不同,它们可能需要按照特定的顺序排列。 (!)

根据SS64 on Start上的文档,您应该能够使用/b/wait开关。该文档没有说明这些开关的顺序很重要,但确实如此。

例如,这将工作(命令顺序混乱,并且不返回ERRORLEVEL):

start "" /wait /b cmd /c "startServer.bat"

但这确实能够按预期工作:

start "" /b /wait cmd /c "startServer.bat"

唯一的区别是交换了/b/wait开关。


我是通过以下步骤偶然发现的:

  • 检查了我在startcallcmd上可以找到的所有文档
  • 将我的头撞在墙上几个小时,尝试我能想到的一切
  • 放弃,并在24小时后回来

我没有尝试任何新的东西,我只是重新开始,并且第一次起作用。与以前的文件版本相比,向我展示了(显然)的细微差别。原来,没有"small" change这样的东西!