web-dev-qa-db-ja.com

「無効なパス0ファイルがコピーされました」xcopyコマンドの使用中にエラーが発生しました

こんにちは、バッチでファイルをコピーするこの小さなコマンドがあります。これは、この特定のコピーを1日に複数回行うので役立ちます。 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を検出しないようにする」チェックボックスについてどこかを読みましたが、それを見つけることができないようです。助けてくれてありがとう。

19
frontin

元の答え

ソースフォルダーパスから末尾の円記号を削除します

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コマンドの出力が処理される場合は、この追加のドットが表示されるパスに含まれることに注意してください。


note:解は限界を超えています。 問題がある理由/場所に興味がある場合は、読み続けてください

xcopy "c:\source\" "d:\target\"が失敗してxcopy "c:\source" "d:\target\"が機能するのはなぜですか?

どちらのコマンドにも有効なパス参照があるようで、...はい!どちらも有効なパス参照ですが、連携してコマンドを失敗させる2つの要素があります。

  • フォルダー参照は引用符で囲まれています(注:引用符は引用符で囲む必要がありますは、パスにスペースや特殊文字が含まれるタイミングがわからないため、引用符で囲むことをお勧めします)
  • xcopycmdによって処理される内部コマンドではなく、実行可能ファイルです

xcopyは外部コマンドであるため、その引数はcmdパーサーコマンドラインロジックに従って処理されません。それらは Microsoft Cスタートアップコード によって処理されます。

このパーサーは2つのルールセット、公式ルールに従います

  • 引数は、スペースまたはタブである空白で区切られます。

  • 二重引用符で囲まれた文字列は、中に含まれる空白に関係なく、1つの引数として解釈されます。引用符で囲まれた文字列を引数に埋め込むことができます。キャレット(^)は、エスケープ文字または区切り文字として認識されないことに注意してください。

  • バックスラッシュが前に付いた二重引用符\"は、リテラル二重引用符(")として解釈されます。

  • 円記号は、二重引用符の直前にない限り、文字どおりに解釈されます。

  • 偶数の円記号の後に二重引用符が続く場合、円記号(\)のペアごとに1つの円記号(\\)がargv配列に配置され、二重引用符(")は文字列区切り文字として解釈されます。

  • 奇数のバックスラッシュの後に二重引用符が続く場合、バックスラッシュ(\)のペアごとに1つのバックスラッシュ(\\)がargv配列に配置され、二重引用符は次のように解釈されます残りのバックスラッシュによるエスケープシーケンス。これにより、リテラルの二重引用符(")がargvに配置されます。

文書化されていない/非公式のルール( コマンドラインパラメータの解析方法

  • 二重引用符で囲まれたブロックの外では、"は二重引用符で囲まれたブロックを開始します。
  • 二重引用符で囲まれたブロック内で、"の後に別の文字が続く(別の"ではない)と、二重引用符で囲まれたブロックが終了します。
  • 二重引用符で囲まれたブロック内では、"の直後に別の"(つまり"")が続くと、単一の"が出力に追加され、二重引用符で囲まれたブロックが続行されます。

このパーサーは、 "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"

末尾のバックスラッシュが削除されるか、追加のドットが含まれる場合、引数の閉じ引用符はエスケープされず、引用符で囲まれたブロックが閉じられ、引数間のスペースは区切り文字として認識されます。

60
MC ND