繁体   English   中英

“复制的路径 0 文件无效” 使用 xcopy 命令时出错

[英]“invalid path 0 files copied” Error while using xcopy command

嗨,我有这个小命令可以批量复制文件,这将有所帮助,因为我每天多次执行此特定复制。 使用 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”复选框的内容,该复选框应该可以解决该问题,但我似乎无法找到它。 任何帮助表示赞赏。

原答案

从源文件夹路径中删除结尾反斜杠

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 启动代码处理

这个解析器遵循两套规则,官方规则

  • 参数由空格分隔,空格或制表符。

  • 被双引号包围的字符串被解释为单个参数,而不管其中包含的空格。 带引号的字符串可以嵌入到参数中。 请注意,插入符号 ( ^ ) 不被识别为转义字符或分隔符。

  • 以反斜杠\\"开头的双引号被解释为文字双引号 ( " )。

  • 反斜杠按字面解释,除非它们紧跟在双引号之前。

  • 如果反斜线偶数后跟一个双引号,则一个反斜杠( \\ )放置在argv数组中每对反斜杠(的\\\\ )和双引号( " )被解释为字符串分隔符.

  • 如果反斜线奇数后跟一个双引号,则一个反斜杠( \\ )放置在argv数组中每对反斜杠(的\\\\ )和双引号由其余反斜杠解释为转义序列,导致在 argv 中放置一个文字双引号 ( " )。

和未记录/非官方规则( 如何解析命令行参数

  • 在双引号块之外, "开始一个双引号块。
  • 在双引号块内,一个"后跟一个不同的字符(不是另一个" )结束双引号块。
  • 在双引号块中,一个"紧跟另一个" (即"" )会导致将单个"添加到输出中,并且双引号块继续。

此解析器将“第一个”参数末尾的序列\\"视为不结束/关闭参数的转义引号,它被视为部分或参数。以及“第二个”“起始”引号参数只是结束双引号块但不结束参数,请记住参数由空格分隔。

所以虽然命令行参数似乎

     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"

当结束反斜杠被移除或包含额外的点时,参数中的结束引号将不会被转义,它将关闭被引用的块,并且参数之间的空格将被视为分隔符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM