【问题标题】:Windows cmd START batch file in new console with quoted arguments带有引用参数的新控制台中的 Windows cmd START 批处理文件
【发布时间】:2018-01-10 17:02:01
【问题描述】:

注意:下面发布了解决方案。

问题:

当需要在新的控制台窗口中,从另一个批处理文件(即 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 命令的要求。发布此问题是因为失败的原因不是很明显,其他人可能会觉得参考有用。

那么,为什么这个命令会失败,以及如何解决这个问题?

【问题讨论】:

    标签: windows batch-file cmd


    【解决方案1】:

    这里发生的情况是,当 START 命令检测到要调用的命令是内部命令(cmd.exe 内部)或批处理文件时,它将调用 cmd.exe 来处理命令(cmd.exe)。 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""
    

    【讨论】:

    • 您还可以通过使用 CMD 的内部 call 命令绕过去除第一个和最后一个引号的解析规则,例如start "title" call "%~DP0CALLEE.CMD" "ARGUMENT_1"。它也可以通过cmd /k(实际上是%ComSpec% /k)运行,但由于它不以引号开头,CMD 不会去掉第一个和最后一个引号。
    • 还可能值得注意的是,根据 START 使用信息,简单地使用 CMD 作为命令而不是扩展名(如 cmd.exe)也会导致 START 用 COMSPEC 替换 CMD。但是,在这种情况下,您仍然需要使用额外的引号。
    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2015-04-28
    • 2010-09-14
    • 2014-04-17
    • 2016-10-28
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多