如何处理使用cmd.exe时的引号字符

我正在尝试这样做:

cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out" 

但是,我遇到的问题是cmd.exe的工作方式。 如果您阅读帮助文件,它会以特殊方式处理“字符”,请参阅问题末尾处的帮助。所以,这不会正确执行…我猜cmd.exe会剥掉一些引号声明不健全。

我可以成功地做到这一点:

 // quotes not required around folder with no spaces cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > C:\temp\FolderWithNoSpaces\SomeProgram.out 

但是,我真的需要第一个工作。 在cmd.exe使用的奇怪的报价处理附近有没有? 我希望它保留所有的报价,但似乎没有一个选项来做到这一点。


从以下输出帮助:cmd /?

如果指定了/ C或/ K,则交换机之后的命令行的其余部分将作为命令行处理,其中以下逻辑用于处理quote(“)字符:

 1. If all of the following conditions are met, then quote characters on the command line are preserved: - no /S switch - exactly two quote characters - no special characters between the two quote characters, where special is one of: &<>()@^| - there are one or more whitespace characters between the the two quote characters - the string between the two quote characters is the name of an executable file. 2. Otherwise, old behavior is to see if the first character is a quote character and if so, strip the leading character and remove the last quote character on the command line, preserving any text after the last quote character. 

啊。 卫生署。 想我已经回答了我自己的问题。

如果你使用/ S,并把整个东西用引号包起来,它只是删除那些外部引号。

 cmd.exe /S /C " do what you like here, quotes within the outermost quotes will be preserved " 

我想你会发现你的例子工作得很好。

 cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out" 

我已经在这里复制你的例子http://pastebin.com/raw.php?i=YtwQXTGN

 C:\>cmd /c "c:\Program Files\my folder\my long program.exe" > "c:\temp\spaces are here\aa" C:\>type "c:\temp\spaces are here\aa" my long program.exe has run C:\> further example demonstrating it works with "my long program.exe", removing cmd /c, it operates fine too. C:\>"c:\Program Files\my folder\my long program.exe" > "c:\temp\spaces are here\ aa" C:\>type "c:\temp\spaces are here\aa" my long program.exe has run C:\> Another example, but with replace. replace with no parameters says "source path required" "no files replaced" C:\>replace > aa Source path required C:\>type aa No files replaced Exactly the same effect when they're in folders with spaces. C:\>cmd /c "c:\Program Files\my folder\replace.exe" > "c:\temp\spaces are here\rr" Source path required C:\>type "c:\temp\spaces are here\rr" No files replaced C:\> further demonstration with replace without cmd /c works fine too. C:\>"c:\Program Files\my folder\replace.exe" > "c:\temp\spaces are here\rr" Source path required C:\>type "c:\temp\spaces are here\rr" No files replaced C:\> 

你的例子工作正常的原因

 cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out" 

以及如何/为什么它的工作方式,是因为>被解释为特殊的host.exe所以这部分cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" – 我认为 – 是首先评估。 即CMD / C没有看到>和以后。

cmd /? 显示2例

案例1和案例2.你的例子适合案例1

 If /C or /K is specified, then the remainder of the command line after the switch is processed as a command line, where the following logic is used to process quote (") characters: 1. If all of the following conditions are met, then quote characters on the command line are preserved: - no /S switch - exactly two quote characters - no special characters between the two quote characters, where special is one of: &<>()@^| - there are one or more whitespace characters between the two quote characters - the string between the two quote characters is the name of an executable file. 2. Otherwise, old behavior is to see if the first character is a quote character and if so, strip the leading character and remove the last quote character on the command line, preserving any text after the last quote character. 

你可以确定你的例子符合case 1,因为如果你添加/ s(除了添加/ s之外不添加任何引号或者对你的例子做任何改变),那么你会得到一个不同的结果,因为它使得你的例子案例2.所以,这certificate你的例子绝对是一个案例1.它明显符合案例1的所有标准。如果你的例子是案例2,并添加/ s,那么它没有任何区别。

你的答案是有趣的,因为它显示了获得你的结果的另一种方式,但在案件2.通过添加额外的outter引号和添加/ s。

但实际上,当你添加这些额外的outter引号时,那么你已经把它作为一个例子2,并且在其上添加一个/ s就没有什么区别了。

 C:\>cmd /c "c:\Program Files\my folder\replace.exe" Source path required No files replaced C:\>cmd /s /c "c:\Program Files\my folder\replace.exe" 'c:\Program' is not recognized as an internal or external command, operable program or batch file. C:\>cmd /c ""c:\Program Files\my folder\replace.exe"" Source path required No files replaced C:\>cmd /s /c ""c:\Program Files\my folder\replace.exe"" Source path required No files replaced C:\> 

在你的问题的例子工作正常

 cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out" 

你给出的替代scheme(用/ S和外部引号)作为一个答案,使这个例子工作,也工作得很好

 cmd.exe /S /C ""C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out"" 

尽pipe你的答案是一个替代scheme,但实际上可以通过删除/ S来简化,因为它已经是一个案例2,所以添加/ s不会有任何区别。 所以这会改善你的答案给出的解决scheme

 cmd.exe /C ""C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out"" 

你在你的问题中描述为问题的例子和你的解决scheme产生了同样的好结果。 但是我想有一个很大的区别(我不知道如何testing),但是你的例子的工作方式和答案的解决方法的一个区别就是我认为在你的例子中,托pipe/调用cmd.exe将redirect到该文件。 而在你的解决scheme的例子中,所调用的cmd.exe是由主机cmd.exe传递的,因此被调用的cmd.exe会执行redirect。 当然,你的例子是一个案例1,而你的解决scheme是你做的一个修正案(非常好),使其工作情况2。

我希望我没有在这里犯错,我可能有。 但是,你的问题和答案确实帮助我围绕如何cmd,特别是cmd / c工作!

也许你的例子是你的实际过于简单,你的实际失败了,需要你的修改。 例如,如果你的例子稍微复杂一点,例如,对引用的程序有一个参数,那么它会失败Case 1,你确实需要outter quotes(/ S不会改变结果,所以不需要/ S,因为一旦添加了所需的外部引号,就已经是案例2了)。 但是你在你的问题中给出的例子在我看来似乎很好。

增加了一个相关的Q和A 什么是cmd / s?