“无效path0文件复制”使用xcopy命令时出错

嗨,我有这个小命令批量复制文件,这将有助于,因为我一天做多个特定的副本。 使用xcopy命令时发生此问题。 一切都是为了,但我收到此错误:“无效的path0文件复制”。 这里是代码:

C:\Windows\System32\xcopy /Y "C:\Users\Ryan\Desktop\mmars_pub\" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\" 

我正在使用xcopy可执行文件的完整path,因为我在configurationpath环境variables时无法正常工作。 我会想象它应该不会影响结果。 我读了一些关于“防止基于MS-DOS的程序检测Windows”checkbox,应该解决这个问题,但我似乎无法find。 任何帮助赞赏。

原始答案

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

 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。

和无证/非官方规则( 如何解析命令行参数 )

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

这个解析器将在第一个参数结尾处找到的序列看作是一个不结束/关闭参数的转义引用,它被看作是参数的一部分,而第二个参数的“起始 参数只是结束双引号块,但不结束参数,请记住,参数是由白色空间分隔。

所以虽然看起来命令行参数是

  vv 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处理的实际参数是

  vv .....argument delimiters v......................v .....quoted block xcopy "x:\souce\" "x:\target\" ^.....................^ .....argument data arg #1 arg #1 = x:\source" x:\target" 

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