您好我有一个小命令来批量复制文件,这将有所帮助,因为我每天多次执行此特定副本。使用xcopy命令时会发生此问题。一切都井然有序,但我收到此错误:“复制的路径0文件无效”。这是代码:
C:\Windows\System32\xcopy /Y "C:\Users\Ryan\Desktop\mmars_pub\" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
我正在使用xcopy可执行文件的完整路径,因为我在配置路径环境变量以正常运行时遇到了问题。我想它不应该影响结果。我在某处读到了“防止基于MS-DOS的程序检测Windows”复选框,应该解决这个问题,但我似乎无法找到它。任何帮助赞赏。
答案 0 :(得分:60)
原始回答
从源文件夹路径中删除结尾反斜杠
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处理。
此解析器遵循两套规则,官方规则
参数由空格分隔,可以是空格或制表符。
由双引号括起的字符串被解释为单个参数,而不管其中包含的空格。引用 string可以嵌入到参数中。请注意,插入符号(
^
)不是 被识别为转义字符或分隔符。以反斜杠
\"
开头的双引号被解释为文字双引号("
)。反斜杠按字面解释,除非它们紧跟在双引号之前。
如果偶数个反斜杠后面跟一个双引号,那么每个argv数组中会放一个反斜杠(
\
) 一对反斜杠(\\
)和双引号("
)是 解释为字符串分隔符。如果奇数个反斜杠后面跟一个双引号,那么每个argv数组中会放一个反斜杠(
\
) 一对反斜杠(\\
)和双引号被解释 作为剩余反斜杠的转义序列,导致文字 双引号("
)放在argv中。
和无证件/非官方规则(How Command Line Parameters Are Parsed)
- 在双引号块之外,
"
启动双引号块。- 在双引号块中,
"
后跟另一个字符(而非另一个"
)结束双引号块。- 在双引号块中,
"
紧跟另一个"
(即""
)会导致单个"
添加到输出中,并且 双引号块继续。
此解析器将“first”参数末尾的序列\"
视为不结束/关闭参数的转义引用,它被视为部分或者论点。 “second”参数的“starting”引用只是结束双引号块而不是结束参数,请记住参数是由空格分隔的。
因此,当似乎时,命令行参数是
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"
当删除结尾反斜杠或包含附加点时,参数中的结束引号将不会被转义,它将关闭引用的块,并且参数之间的空格将被视为分隔符。