【问题标题】:how to call a batch file with spaces in its path from another batch file and return control to the parent batch file如何从另一个批处理文件调用其路径中有空格的批处理文件并将控制权返回给父批处理文件
【发布时间】:2012-11-17 08:26:40
【问题描述】:

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

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

只要 %ROOT_HOME% 的路径中没有空格,它就可以正常工作。

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

我已经尝试了 cmdstartcall 的所有组合,但仍然无法达到预期的效果。

另外 bat1.bat 里面没有 exit 并且不能修改。 所以单独使用call只会执行子批处理文件,不会返回父批处理文件。

【问题讨论】:

  • 为什么你用这么复杂的线路来打电话?为什么不简单call?你的电话应该像这样call cmd /c start /b "%ROOT_HOME%\folder1\bin\bat1.bat"
  • 调用只需要一个参数..因此要执行多个内部命令,它们必须作为字符串(在“”内)给出。试过你的方法,不行。 bat1 没有被执行。

标签: cmd batch-file


【解决方案1】:

应该就这么简单

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

【讨论】:

  • 同意这将调用批处理文件,但它会打开另一个控制台供子批处理文件执行,并且子批处理文件没有 EXIT 并且无法修改。因此控制台不会自动关闭。因此必须与 cmd 和 start 结合使用,因为它们允许批处理在同一个控制台中执行,而无需另一个窗口。
  • @r3ap3r 好的,我已经编辑了答案以反映您的初始命令。
  • 不,这也不起作用。试一试。我认为“调用”只能接受单个参数。在您的命令中,“调用”将 cmd /c 作为其参数并打开一个不会做任何事情也不会显示任何东西的控制台。因此包含在“”之间(作为字符串)。
  • 我用一个带空格的虚拟文件试了一下,效果很好。您调用的批处理文件是否会返回?如果它只是从脚本的末尾掉下来,那么它应该不需要退出。如果你手动运行它会关闭吗?
【解决方案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"

【讨论】:

  • 我会建议相同的:-)
【解决方案3】:

您根本不需要call,因为无论如何您都是通过cmd 生成新批次:

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

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

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

作为一般规则:围绕某事物进行更多层的解析和执行只会使事情变得更加复杂,并且很少会解决问题。参照。在 PowerShell 中过度使用 iex

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多