为啥 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 我只是想弄清楚该命令是否按原样工作。如果它不能按原样工作,很可能它不适用于 start
或 call
或其他任何东西。
@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 /k
和 cmd /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 参数?
OpenCV - 为啥光流不适用于 dequeue<Mat>?