原答案
从源文件夹路径中删除结尾的反斜杠
C:\Windows\System32\xcopy.exe /Y "C:\Users\Ryan\Desktop\mmars_pub" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
已编辑 2015/10/01
虽然原始问题使用文字路径,并且指示的解决方案将解决问题,但还有另一种选择。对于文字路径以及路径在变量内部并且可以(或不)以反斜杠结尾的情况,确保结尾反斜杠(如果存在)与引号分开就足够了,包括结尾点。
xcopy /y "x:\source\." "x:\target"
xcopy /y "%myVariable%." "x:\target"
这个结束点不会影响文件/文件夹的名称。如果有和结尾的反斜杠,附加的点将简单地引用同一个文件夹。如果没有结束反斜杠,如 windows 文件和文件夹不能以点结束其名称,它将被丢弃。
但是如果xcopy 命令的输出将被处理,请记住这个额外的点将包含在显示的路径中。
注意:解决方案高于线。如果对存在问题的原因/位置感兴趣,请继续阅读。
为什么xcopy "c:\source\" "d:\target\" 失败但xcopy "c:\source" "d:\target\" 有效?
这两个命令似乎都有有效的路径引用,而且……是的!两者都是有效的路径引用,但有两个元素共同作用导致命令失败:
- 文件夹引用被引用(注意:它应该被引用,引用路径是一个好习惯,因为你永远不知道它们何时会包含空格或特殊字符)
-
xcopy 不是cmd 处理的内部命令,而是一个可执行文件
由于xcopy 是一个外部命令,它的参数不会按照cmd 解析器命令行逻辑进行处理。它们由Microsoft C startup code 处理。
这个解析器遵循两套规则,官方规则
-
参数由空格分隔,空格或制表符。
-
用双引号括起来的字符串被解释为单个参数,无论其中包含什么空格。一个引用
字符串可以嵌入到参数中。请注意,插入符号 (^) 不是
识别为转义字符或分隔符。
-
前面有反斜杠 \" 的双引号被解释为文字双引号 (")。
-
反斜杠按字面意思解释,除非它们紧跟在双引号之前。
-
如果偶数个反斜杠后跟双引号,则每个反斜杠 (\) 将放置在 argv 数组中
一对反斜杠 (\\),双引号 (") 是
解释为字符串分隔符。
-
如果奇数个反斜杠后跟双引号,则每个反斜杠 (\) 将放置在 argv 数组中
一对反斜杠 (\\) 和双引号被解释
作为剩余反斜杠的转义序列,导致文字
双引号 (") 放在 argv 中。
和无证/非官方规则 (How Command Line Parameters Are Parsed)
- 在双引号块之外,
" 开始一个双引号块。
- 在双引号块内,
" 后跟一个不同的字符(不是另一个 ")结束双引号块。
- 在双引号块内,
" 紧跟另一个 "(即"")会导致将单个 " 添加到输出中,并且
双引号块继续。
此解析器将在 "first" 参数末尾找到的序列\" 视为不结束/关闭参数的转义引号,它被视为部分或参数。而 "second" 参数的 "starting" 引号只是结束了双引号块但没有结束参数,请记住参数由空格分隔。 p>
所以虽然 似乎命令行参数是
v v v......argument delimiters
v.........v v..........v ......quoted blocks
xcopy "x:\souce\" "x:\target\"
^.......^ ^........^ ......argument data
arg #1 arg #2
arg #1 = x:\source\
arg #2 = x:\target\
xcopy 处理的实际参数是
v v .....argument delimiters
v......................v .....quoted block
xcopy "x:\souce\" "x:\target\"
^.....................^ .....argument data
arg #1
arg #1 = x:\source" x:\target"
当结束反斜杠被删除或包含额外的点时,参数中的右引号不会被转义,它会关闭带引号的块,参数之间的空格将被视为分隔符。