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

4

我正在尝试从一个批处理文件中调用另一个批处理文件,第二个批处理文件执行完后,控制应返回到第一个批处理文件并继续执行。

目前我在父批处理文件中使用以下命令:

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

只要%ROOT_HOME%的路径中不含有空格,这个方法就能正常工作。
如果路径中包含了空格,上述命令就会失败。
我已经尝试了各种组合使用cmd、start和call等命令,但仍无法达到预期的结果。
另外,bat1.bat文件内部没有exit命令,也不能进行修改。 因此,只使用call命令仅会执行子批处理文件,而不会返回父批处理文件。

为什么你要使用如此复杂的命令行来进行调用?为什么不直接使用 call 呢?你的调用应该像这样工作:call cmd /c start /b "%ROOT_HOME%\folder1\bin\bat1.bat" - npocmaka
调用只接受一个参数,因此为了执行多个内部命令,它们必须作为字符串(放在“”中)给出。尝试过您的方法,但没有成功。bat1没有被执行。 - r3ap3r
3个回答

4

您根本不需要在那里使用call,因为您是通过cmd生成新批处理的:

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

虽然我不知道为什么你要使用 start /b,除非你担心环境污染(可以通过在调用周围使用 setlocal/endlocal 来轻松恢复),所以 call 也应该足够:

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

一般来说:对于某个内容,增加解析和执行层次只会让事情更加复杂,并且很少能解决问题。类似于在 PowerShell 中过度使用 iex

2

如果您尝试使用较短的路径会怎么样呢:

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

1
我也想建议同样的事情 :-) - anishsane

1

应该就这么简单

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

同意这将调用批处理文件,但它会打开另一个控制台来执行子批处理文件,而子批处理文件没有EXIT并且无法修改,因此控制台不会自动关闭。因此必须与cmd和start组合使用,因为它们允许批处理在同一个控制台中执行而无需另一个窗口。 - r3ap3r
1
@r3ap3r 好的,我已经编辑了我的答案以反映您最初的命令。 - Bali C
不行,这也不起作用。我试过了。我认为“call”只能接受单个参数。在你的命令中,“call”将把cmd /c作为其参数并打开一个控制台,它不会执行任何操作,也不会显示任何内容。因此需要用引号将其括起来(作为字符串)。 - r3ap3r
我用一个带空格的虚拟文件试过了,它可以正常工作。你调用的批处理文件是否有返回值?如果它只是从脚本末尾掉下来,那么它不需要退出。如果你手动运行它,它是否会关闭? - Bali C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接