注意:解决方案发布在下面。
问题:
当需要在新的控制台窗口中从另一个批处理文件(即CALLER.CMD)中启动批处理文件(cmd脚本)(即CALLEE.CMD)时,显而易见的选择是使用内部START命令: START "" "%~DP0CALLEE.CMD"
。
但是,如果我们需要将引用的参数传递给CALLEE.CMD,例如START "" "%~DP0CALLEE.CMD" "ARGUMENT_1"
,则会出现错误,例如'CALLEE.CMD" "ARGUMENT_1' is not recognized as an internal or external command,
operable program or batch file.
乍一看,这个命令失败的原因并不明显,因为似乎满足了调用START命令的要求。这个问题已经公布,因为失败的原因并不是很明显,其他人可能会发现这个参考有用。
那么,为什么这个命令失败了,以及如何解决这个问题?
答案 0 :(得分:1)
这里发生的事情是,当START命令检测到要调用的命令是内部命令(cmd.exe内部)或批处理文件时,它将调用cmd.exe来处理命令(cmd。将使用exe / K ...)。传递给START的其他参数将被转换并传递给cmd.exe。发生这种情况时,规则会发生变化:cmd.exe要求命令和参数的引用与START不同,因此在编写原始命令时必须考虑这一点。
cmd.exe的引用记录在别处,例如:
因此,要在新的控制台窗口中使用带引号的参数启动批处理文件,我们可以执行以下操作:
START cmd.exe /K ""%~DP0CALLEE.CMD" "ARGUMENT_1" "ARGUMENT_2""
当然,只有当你需要引用参数时才会出现这个问题,因为被调用的程序需要它或者参数中有空格。
另外,如果您不希望新的控制台窗口在完成批处理文件后保持打开状态,则可以使用/K
替换开关/C
。
此处避免了在调用带引号的命令时始终需要提供窗口标题的要求,但如果您执行要求为新控制台窗口的标题添加前缀,则可以执行以下操作:
START "<Title>" cmd.exe /K ""%~DP0CALLEE.CMD" "ARGUMENT_1" "ARGUMENT_2""
示例代码:
CALLEE.CMD
@ECHO %*
@PAUSE
CALLER.CMD
@START "<Title>" cmd.exe /C ""%~DP0CALLEE.CMD" "ARGUMENT_1" ARGUMENT_2 "ARGUMENT_3""