Cmd 如何从另一个批处理文件调用路径中带有空格的批处理文件,并将控制权返回到父批处理文件

Cmd 如何从另一个批处理文件调用路径中带有空格的批处理文件,并将控制权返回到父批处理文件,cmd,batch-file,Cmd,Batch File,我试图从另一个批处理文件调用批处理文件,在第二个批处理文件执行后,控件应返回到第一个批处理文件,并应恢复执行。 目前,我正在父批处理文件中使用以下命令: call "cmd /c start /b %ROOT_HOME%\folder1\bin\bat1.bat" 只要%ROOT\u HOME%的路径中没有空格,这就可以正常工作 如果路径中包含空格,则上述命令将失败 我尝试了cmd、start、call的每种组合,但仍然无法达到预期的效果 此外,bat1.bat内部没有退出,无法修改。 因此,

我试图从另一个批处理文件调用批处理文件,在第二个批处理文件执行后,控件应返回到第一个批处理文件,并应恢复执行。 目前,我正在父批处理文件中使用以下命令:

call "cmd /c start /b %ROOT_HOME%\folder1\bin\bat1.bat"
只要%ROOT\u HOME%的路径中没有空格,这就可以正常工作

如果路径中包含空格,则上述命令将失败

我尝试了cmdstartcall的每种组合,但仍然无法达到预期的效果

此外,bat1.bat内部没有退出,无法修改。
因此,单独使用调用只执行子批处理文件,而不返回父批处理文件。

应该如此简单

call cmd /c start /b "" "%ROOT_HOME%\folder1\bin\bat1.bat"

如果您尝试使用短路径:

for /f %%P in (%ROOT_HOME%) do set SHORT_ROOT_HOME=%%~sP
call "cmd /c start /b  %SHORT_ROOT_HOME%\folder1\bin\bat1.bat"

您根本不需要在那里调用
call
,因为您正在通过
cmd
生成新批:

start "" /b "%ROOT_HOME%\folder1\bin\bat1.bat"
虽然我想知道为什么要使用
start/b
,除非您担心环境污染(在调用前后使用
setlocal
/
endlocal
可以轻松恢复),但是
call
也应该足够了:

call "%ROOT_HOME%\folder1\bin\bat1.bat"

作为一般规则:围绕某事物的更多层次的解析和执行只会使事情变得更复杂,很少会使问题消失。Cf.在PowerShell中过度使用
iex

为什么调用时使用如此复杂的行?为什么不简单地使用
call
?您的调用应该是这样的
call cmd/c start/b”%ROOT\u HOME%\folder1\bin\bat1.bat“
调用只接受一个参数。因此,对于执行多个内部命令,它们必须作为字符串给定(在“”内)。尝试了您的方法,但无效。bat1未被执行。同意这将调用批处理文件,但它将打开另一个控制台供子批处理文件执行,并且子批处理文件没有出口,无法修改。因此控制台不会自动关闭。因此,必须与cmd和start结合使用,因为它们允许批处理在同一控制台内执行,而不需要另一个窗口。@r3ap3r好的,我已编辑了我的答案以反映您的初始命令。不,这也不起作用。请尝试一下。我认为“call”只能接受单个参数。在您的命令中,“call”将以cmd/c作为其参数,并打开一个控制台,该控制台不会执行任何操作,也不会显示任何内容。因此,将其括在“”之间(作为字符串)。我用一个带空格的虚拟文件进行了尝试,效果很好。您正在调用的批处理文件是否会返回?如果它只是从脚本末尾掉下来,那么应该不需要退出。如果您手动运行它,它是否会关闭?我想建议相同:-)