簡體   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