1. ホーム
  2. windows

[解決済み] xcopyコマンド使用時に "invalid path 0 files copied "というエラーが発生する。

2022-02-18 14:06:45

質問

こんにちは、私はバッチでファイルをコピーするためにこの小さなコマンドを持っています、私はこの特定のコピーを一日に何度も行うので、それは助けになります。問題は、xcopyコマンドを使用しているときに発生します。全て正常なのですが、次のようなエラーが発生します: "無効なパス 0 files copied". 以下はそのコードです。

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

xcopyの実行ファイルへのフルパスを使用しているのは、path環境変数が正しく機能するように設定するのに苦労したからです。しかし、結果には影響しないはずだと想像しています。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

元の質問ではリテラルのパスを使用しており、示された解決策で問題は解決しますが、もう1つの選択肢があります。リテラルパスの場合、およびパスが変数内にあり、バックスラッシュで終わる可能性がある(またはない)場合、終了バックスラッシュ(ある場合)が終了ドットを含む引用符から分離されていることを確認すれば十分です。

xcopy /y "x:\source\." "x:\target"
xcopy /y "%myVariable%." "x:\target"

この終端ドットは、ファイル/フォルダー名に干渉しません。もし末尾にバックスラッシュがあれば、追加されたドットは単に同じフォルダを参照することになります。Windowsのファイルやフォルダーがドットで名前を終えることができないように、バックスラッシュがない場合、それは破棄されます。

しかし、もし xcopy コマンドで処理される場合、この追加のドットは表示されるパスに含まれることを覚えておいてください。


ノート : 解答は行の上にあります。がある理由/場所に興味があれば、読み進めてください。 問題 .

なぜ xcopy "c:\source\" "d:\target\" は失敗するが xcopy "c:\source" "d:\target\" が動作するのか?

どちらのコマンドも有効なパス参照を持っているように見えますが・・・。はい!両方とも有効なパス参照ですが、コマンドを失敗させるために一緒に働く2つの要素があります。

  • フォルダ参照が引用されている(注:これは が必要です。 パスがいつスペースや特殊文字を含むか分からないので、引用するのは良い習慣です)
  • xcopy が処理する内部コマンドではありません。 cmd ではなく、実行可能なファイル

として xcopy は外部コマンドであるため、その引数は cmd パーサーのコマンドラインロジックです。これらは Microsoft C起動コード .

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

  • 引数は空白で区切られ、スペースかタブのどちらかです。

  • ダブルクォーテーションで囲まれた文字列は、空白に関係なく1つの引数として解釈されます。引用符で囲まれた の文字列を引数に埋め込むことができる。なお、キャレット( ^ は使用できません。 はエスケープ文字またはデリミタとして認識される。

  • バックスラッシュを前にした二重引用符。 \" は、リテラルなダブルクオーテーションマークとして解釈されます ( " ).

  • バックスラッシュは、二重引用符の直前でない限り、文字通りに解釈されます。

  • 偶数個のバックスラッシュの後にダブルクォーテーションが続く場合、1個のバックスラッシュ( \ に対して、argv 配列に配置されます。 バックスラッシュのペア( \\ )、ダブルクオーテーションマーク( " ) は は文字列の区切り文字として解釈される。

  • 奇数個のバックスラッシュの後にダブルクォーテーションが続く場合、1個のバックスラッシュ( \ に対して、argv 配列に配置されます。 バックスラッシュのペア( \\ と解釈され、ダブルクォーテーションは をエスケープシーケンスとみなし、残りのバックスラッシュによって、リテラル ダブルクォーテーション ( " )をargvに配置します。

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

  • 二重引用符で囲まれたブロックの外側には " は二重引用符で囲まれたブロックを開始します。
  • 二重引用符で囲まれたブロックの中に " の後に別の文字(別の " が二重引用符で囲まれたブロックを終了させます。
  • 二重引用符で囲まれたブロックの中に " に続いて、すぐに別の " (すなわち "" を使用すると、1つの " が出力に追加され 二重引用符で囲まれたブロックが続きます。

このパーサーは、次のシーケンスを見ます。 \" の末尾にある "最初の" をエスケープした引用であり、議論を終わらせたり閉じたりしていないため、議論の一部と見なされています。また "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"

終了バックスラッシュを削除したり、ドットを追加した場合、引数の閉じ引用はエスケープされず、引用ブロックを閉じ、引数間のスペースはデリミタとみなされます。