为啥 Windows START 命令不适用于参数和路径中的空格?

Posted

技术标签:

【中文标题】为啥 Windows START 命令不适用于参数和路径中的空格?【英文标题】:Why does windows START command not work with spaces in arguments AND path?为什么 Windows START 命令不适用于参数和路径中的空格? 【发布时间】:2013-07-14 11:58:28 【问题描述】:

此命令有效

START /b /wait "Dummy title" "C:\tmp\test runner2.bat" arg1 arg2

但这两个都失败了!

START /b /wait "Dummy title" "C:\tmp\test runner2.bat" arg1 arg2 "arg 3" arg4
START /b /wait "Dummy title" "C:\tmp\test runner2.bat" arg1 arg2 "arg 3"

错误是:

'C:\tmp\test' is not recognized as an internal or external command, operable program or batch file.

显然它与围绕参数的" 有关,但为什么以及如何解决这个问题?

相关问题:

How to create batch file in Windows using “start” with a path and command with spaces Can I use the “start” command with spaces in the path?

【问题讨论】:

不启动也行吗? "C:\tmp\test runner2.bat" arg1 arg2 "arg 3" arg4 使用call,而不是start,从其他批处理脚本运行批处理脚本。 @AnsgarWiechers 我只是想弄清楚该命令是否按原样工作。如果它不能按原样工作,很可能它不适用于 startcall 或其他任何东西。 @devnull 它适用于call 如果命令不是批处理脚本(而是 .exe 文件)怎么办?那么CALL 就不行了,对吧?我尚未对其进行测试,但我认为即使是这种情况,原始问题仍然存在? 【参考方案1】:

这并不能回答我的问题,但它确实解决了我遇到的直接问题。

在阅读“Problem with quotes around file names in Windows command shell”帖子时,我发现了一个解决方法:

cmd.exe /C ""C:\tmp\test runner2.bat" arg1 arg2 "arg 3" arg4"

还有其他解决方法,只需使用call 命令执行命令即可(如Ansgar Wiechers 所述)

call "C:\tmp\test runner2.bat" arg1 arg2 "arg 3" arg4

【讨论】:

【参考方案2】:

这是 START 命令的一个已知错误。 如果您在命令和参数中都有空格并尝试用引号处理它们,则会失败。

首先 START 命令检查完整的命令是否存在。 但它只开始第一部分。

在您的情况下,它会查找 "C:\tmp\test runner2.bat",但尝试启动 C:\tmp\test

当命令被CALL替换时,你可以避免它

START /b /wait "Dummy title" CALL "C:\tmp\test runner2.bat" arg1 arg2 "arg 3" arg4

START 使用cmd /k 启动新进程。 这就是不当行为的原因。 Paul Groke 提到了这样一个事实,即只有在批处理文件时才会发生这种情况。Exe 文件将被直接执行,因此它们不受 cmd.exe 错误的影响。

你的情况

C:\Windows\system32\cmd.exe  /K "C:\tmp\test runner2.bat" arg1 arg2 "arg 3" arg4

cmd /kcmd /c 的帮助解释说,在这种情况下,第一个和最后一个引号被删除。

【讨论】:

我试了大约一个小时......但是对于一个错误我当然无能为力:) 这似乎只有在使用start 执行批处理文件时才会发生。如果用 start 来启动.exe,这个问题不会发生。 4 年后,这仍然是一个错误...但是非常感谢您提供非常有用的答案:)【参考方案3】:

“Jeb”已经指出了正确的方向。就我而言,我没有尝试运行批处理,而是“程序文件”文件夹中的程序(启动程序后批处理将终止)。调用时

START "C:\Program Files\MyAppPath\MyApp.exe" arg1 arg2 ... argN

用引号输入的路径应该是 START 命令的“标题”参数。要摆脱这种情况,您必须“伪造”这样的窗口标题:

START "" "C:\Program Files\MyAppPath\MyApp.exe" arg1 arg2 ... argN

这对我有帮助。

【讨论】:

抱歉 - 我发现问题属于 PATH 和 ARGUMENTS 中的空格... 这对我也有帮助:D 看在上帝的份上...我为此浪费了一些时间。它应该是“开始”然后我想开始。

以上是关于为啥 Windows START 命令不适用于参数和路径中的空格?的主要内容,如果未能解决你的问题,请参考以下文章

为啥空声明适用于带有 int 参数的定义,但不适用于 float 参数?

为啥 Slime 检查仅适用于鼠标单击而不适用于键盘命令?

为啥我的代码不适用于较旧的访问驱动程序?

OpenCV - 为啥光流不适用于 dequeue<Mat>?

cURL - 文件路径位置的文件上传不适用于 Windows 命令提示符

简单的 SQL 命令不适用于特定参数