原答案
从源文件夹路径中删除结尾反斜杠
C:\Windows\System32\xcopy.exe /Y "C:\Users\Ryan\Desktop\mmars_pub" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
edited2015/10/01
虽然最初的问题使用了文字路径,并且指示的解决方案将解决问题,但还有另一种选择。对于文字路径以及路径位于变量内部并且可以(或不)以反斜杠结尾的情况,只需确保结尾反斜杠(如果存在)与引号分开,包括结束点。
xcopy /y "x:\source\." "x:\target"
xcopy /y "%myVariable%." "x:\target"
此结束点不会干扰文件/文件夹名称。如果有结尾反斜杠,则附加点将仅引用同一文件夹。如果没有结尾反斜杠,就像 Windows 文件和文件夹不能以点结尾其名称一样,它将被丢弃。
但是如果输出xcopy
命令将被处理,请记住这个附加点将包含在显示的路径中。
note: 解决方案在线上。如果对为什么/哪里有兴趣,请继续阅读problem.
Why xcopy "c:\source\" "d:\target\"
失败但是xcopy "c:\source" "d:\target\"
works?
这两个命令似乎都有有效的路径引用,并且......是的!两者都是有效的路径引用,但有两个元素共同作用导致命令失败:
- 引用文件夹引用(注意:它should被引用,引用路径是一个好习惯,因为你永远不知道它们何时会包含空格或特殊字符)
-
xcopy
不是由处理的内部命令cmd
但一个可执行文件
As xcopy
是一个外部命令,它的参数不会按照以下方式处理cmd
解析器命令行逻辑。它们由微软C启动代码 https://msdn.microsoft.com/en-us/library/a1y7w461.aspx.
这个解析器遵循两组规则,官方规则
-
参数由空格分隔,空格可以是空格,也可以是制表符。
-
用双引号括起来的字符串将被解释为单个参数,无论其中是否包含空格。引用了一个
字符串可以嵌入到参数中。请注意,插入符号 (^
) 不是
被识别为转义字符或分隔符。
-
双引号前面有一个反斜杠,\"
, 被解释为文字双引号 ("
).
-
反斜杠按字面意思解释,除非它们紧接在双引号之前。
-
如果偶数个反斜杠后跟双引号,则一个反斜杠 (\
) 被放置在每个 argv 数组中
一对反斜杠 (\\
) 和双引号 ("
) 是
解释为字符串分隔符。
-
如果奇数个反斜杠后跟双引号,则一个反斜杠 (\
) 被放置在每个 argv 数组中
一对反斜杠 (\\
) 并且双引号被解释
作为剩余反斜杠的转义序列,导致文字
双引号("
) 放置在 argv 中。
和无证/非官方规则(命令行参数如何解析 http://www.daviddeley.com/autohotkey/parameters/parameters.htm)
- 在双引号块之外 a
"
开始一个双引号块。
- 在双引号块内
"
后面跟着一个不同的字符(不是另一个"
) 结束双引号块。
- 在双引号块内
"
紧接着是另一个"
(i.e. ""
)导致单个"
要添加到输出中,并且
双引号块继续。
该解析器看到序列\"
发现在末尾"first"参数作为转义引号,不会结束/关闭参数,它被视为参数的一部分。还有“开始”的报价"second"参数只是结束双引号块,但没有结束参数,请记住参数是由空格分隔的。
所以虽然它seems命令行参数是
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
is
v v .....argument delimiters
v......................v .....quoted block
xcopy "x:\souce\" "x:\target\"
^.....................^ .....argument data
arg #1
arg #1 = x:\source" x:\target"
当删除结尾反斜杠或包含附加点时,参数中的结束引号将不会被转义,它将关闭引用的块,并且参数之间的空格将被视为分隔符。