我有以下问题:
我创建了一个批处理脚本,在那里调用自己(因为能够并行写入日志)。在脚本中,我启动另一个进程(如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),同样的结果!在第一种情况下,它挂起,在第二种情况下,我的窗口按预期关闭......
你们之前有没有遇到过这样的问题,知道这里有什么问题吗? 流程挂断了!
答案 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
开关。
我是通过以下步骤偶然发现的:
start
和call
和cmd
上可以找到的所有文档我没有尝试任何新的东西,我只是重新开始,并且第一次起作用。与以前的文件版本相比,向我展示了(显然)的细微差别。原来,没有"small" change这样的东西!