Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 退出/B 0不工作_Batch File_Cmd - Fatal编程技术网

Batch file 退出/B 0不工作

Batch file 退出/B 0不工作,batch-file,cmd,Batch File,Cmd,我有以下问题: 我创建了一个批处理脚本,它在其中调用自身(以便能够并行地编写日志)。在脚本中,我启动了另一个进程(如start startServer.bat),它启动了一个java进程并一直保持打开状态 在我的原始脚本中,我等待30秒,检查进程是否正在运行,并执行以下操作: exit /B 0 不幸的是,这不起作用,窗口显示正在评估退出/B 0,但窗口仍保持打开状态。当我用另一个进程关闭窗口时(意味着在my.bat中启动的“子”进程),我的脚本将继续运行 因此: scriptA.bat -&

我有以下问题:

我创建了一个批处理脚本,它在其中调用自身(以便能够并行地编写日志)。在脚本中,我启动了另一个进程(如
start startServer.bat
),它启动了一个java进程并一直保持打开状态

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

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

因此:

scriptA.bat

-> in there I call: start startServer.bat
-> wait 30 seconds
-> check is server is started
-> exit /B 0
Process hangs up!
-> 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!
非常奇怪的是,如果我用另一个脚本,比如:

scriptB.bat

-> in there I call: start startServer.bat
-> wait 30 seconds
-> check is server is started
-> exit /B 0
Process hangs up!
-> 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),同样的结果!在第一种情况下它会挂断,在第二种情况下我的窗口会按预期关闭

你们中有谁曾经有过这样的问题,并且知道这里出了什么问题吗?
进程挂断

关于退出批处理脚本的所有选项,这里有一个很好的解释:

具体而言,从该页:

DOS联机帮助(帮助退出)没有明确说明/B参数是否退出当前脚本实例,这不一定与退出当前脚本相同。 即,如果脚本位于被调用的代码段中,则退出/B将退出调用,而不是脚本


因此,在这种情况下,您肯定不希望
退出/b0
。如果退出0不起作用,请尝试转到EOF

我想您的问题在于
start
命令。以下摘录可能会指向这个问题:

命令/程序

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

如果不是内部cmd命令 或批处理文件,则它是一个程序和 将以窗口模式运行 应用程序或控制台应用程序

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

start "" cmd /c "startServer.bat"
这封信很好。这里还有一些未记录(或至少不清楚)的行为

在您的问题中,您的情况有些复杂,但假设您正在从原始批处理文件调用/启动批处理文件,在被调用的批处理文件中使用
exit/b0
,并希望可以在原始批处理文件中访问ERRORLEVEL

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

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

例如,这将不起作用(命令运行顺序错误,并且不会返回ERRORLEVEL):

但是这个确实像预期的那样工作:

start "" /b /wait cmd /c "startServer.bat"
唯一的区别是交换
/b
/wait
开关


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

  • 检查了
    start
    call
    cmd
  • 我的头撞在墙上好几个小时,想尽一切办法
  • 放弃了,24小时后回来

我没有尝试任何新的东西,我只是重新开始,第一次就成功了。与以前的文件版本相比,我发现了这个(显然)微小的差异。事实证明,世上根本就没有所谓的

但对于后藤:如果我不能给出错误等级,对吗SI尝试使用goto:EOF,但没有区别:D:>goto:EOF然后进程将挂起,直到我关闭其他进程窗口为止;(不,那不太好用……正如我说的,它的工作原理如下:call scriptA.bat>log.txt------>在那里我调用:start startServer.bat在我使用之前:call scriptA.bat | tee log.txt------>在那里我调用:start startServer.bat和tee命令它不起作用,whyeverso…@murxx:谢谢你的反馈。通常你应该这样做尽可能多地发布关于您的问题的详细信息。否则,很难“猜测”问题可能在哪里。最好的是,您总是展示产生问题的代码。此外,您应该开始接受问题的有用答案的习惯。
start "" /b /wait cmd /c "startServer.bat"