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

fro*_*tin 19 windows xcopy path batch-file filepath

嗨,我有一个小命令来批量复制文件,这将有所帮助,因为我每天多次执行此特定副本.使用xcopy命令时会发生此问题.一切都井然有序,但我收到此错误:"复制的路径0文件无效".这是代码:

C:\Windows\System32\xcopy  /Y "C:\Users\Ryan\Desktop\mmars_pub\" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
Run Code Online (Sandbox Code Playgroud)

我正在使用xcopy可执行文件的完整路径,因为我无法正确配置路径环境变量.我想它不应该影响结果.我在某处读到了"防止基于MS-DOS的程序检测Windows"复选框,应该解决这个问题,但我似乎无法找到它.任何帮助赞赏.

MC *_* ND 62

原始答案

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

C:\Windows\System32\xcopy.exe  /Y "C:\Users\Ryan\Desktop\mmars_pub" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
Run Code Online (Sandbox Code Playgroud)

编辑 2015/10/01

虽然原始问题使用了文字路径,并且指示的解决方案将解决问题,但还有另一种选择.对于文字路径以及路径在变量内并且可以(或不以)以反斜杠结尾的情况,足以确保结尾反斜杠(如果存在)与引号分开,包括结束点.

xcopy /y "x:\source\." "x:\target"
xcopy /y "%myVariable%." "x:\target"
Run Code Online (Sandbox Code Playgroud)

此结束点不会干扰文件/文件夹名称.如果有和结束反斜杠,附加点将简单地引用相同的文件夹.如果在Windows文件中没有结束反斜杠,并且文件夹无法用点结束其名称,则将被丢弃.

但是,如果xcopy将处理命令的输出,请记住此附加点将包含在显示的路径中.


注意:解决方案在线以上.如果对出现问题的原因/地点感兴趣,请继续阅读.

为什么xcopy "c:\source\" "d:\target\"失败但xcopy "c:\source" "d:\target\" 有效?

这两个命令似乎都有有效的路径引用,并且......是的!两者都是有效的路径引用,但有两个元素一起工作以使命令失败:

  • 引用文件夹引用(注意:它应该引用,引用路径是一个好习惯,因为你永远不知道它们何时会包含空格或特殊字符)
  • xcopy不是由cmd可执行文件处理的内部命令

xcopy外部命令一样,其参数不会在cmd解析器命令行逻辑之后处理.它们由Microsoft C启动代码处理.

该解析器遵循两套规则,即官方规则

  • 参数由空格分隔,空格可以是空格或制表符.

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

  • 带有反斜杠的双引号将\"被解释为文字双引号(").

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

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

  • 如果奇数个反斜杠后跟一个双引号,那么每个反斜杠(\)对的argv数组中都会放置一个反斜杠(\\),并且双引号会被剩余的反斜杠解释为转义序列,从而导致文字双引号(")放在argv中.

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

  • 在双引号块之外,a "启动双引号块.
  • 在双引号块内,"后跟不同的字符(不是另一个")结束双引号块.
  • 在双引号块a内,"紧接着另一个"(即"")导致单个"被添加到输出,并且双引号块继续.

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

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

     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\
Run Code Online (Sandbox Code Playgroud)

处理的实际参数xcopy

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

      arg #1 = x:\source" x:\target"
Run Code Online (Sandbox Code Playgroud)

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