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

时间:2014-09-15 04:31:49

标签: windows batch-file path filepath xcopy

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

1 个答案:

答案 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"

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