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

Posted

技术标签:

【中文标题】“复制了无效的路径 0 文件”使用 xcopy 命令时出错【英文标题】:"invalid path 0 files copied" Error while using xcopy command 【发布时间】:2014-09-15 04:31:49 【问题描述】:

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

【问题讨论】:

您使用的xcopy 命令不是基于MS-DOS 的程序。这是一个 Windows 控制台程序。 %path% 变量默认设置为使用正确的文件夹。如果您重新使用了 path 变量,请选择不同的变量名称。这仅与您必须将完整路径设置为 xcopy 命令的方式有关。 【参考方案1】:

原答案

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

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"

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

【讨论】:

arg #1 = <x:\souce" >(去掉<>)双引号块在目标的first双引号结束。 @MayraDelgado,不,分隔符是空格。目标中的第一个引号只是关闭了引用的区域,但在它之后没有空格,所以参数继续。 如果您在构建事件中使用像 $(TargetDir) 这样的宏,那么不幸的是它们在目录中包含反斜杠,因此请注意这一点。 解决了!谢谢!它在 Visual Studio 上本地运行良好,但在使用 msbuild 时会在 Jenkins 中失败。

以上是关于“复制了无效的路径 0 文件”使用 xcopy 命令时出错的主要内容,如果未能解决你的问题,请参考以下文章

xcopy的使用

使用 xcopy 进行并行复制

xcopy-参数详解

xcopy-参数详解

xcopy 和 robocopy 的区别

xcopy 高级使用