私はビルド後のイベントにあまり詳しくないので、プログラムで何が問題になっているのか少し混乱しています。 Visual Studio 2010でコンパイルすると、次の結果が得られます。
The command "xcopy C:\Users\Me\Path\Foo.bar\Library\dsoframer.ocx C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
xcopy C:\Users\Me\Path\Foo.bar\ApplicationFiles C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
xcopy C:\Users\Me\Path\url\ C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
rmdir /S /Q C:\Users\Me\Path\Foo.bar\bin\Debug\.gwt-tmp" exited with code 4.
このエラーにもかかわらず、プログラムappearsは正常に実行されますが、この問題を無視して、何も悪いことが起こらないことを望みません。奇妙なことに、この行は単一のコマンド(最初のxcopy)として始まりましたが、プロジェクトをコンパイルし続けると(他の問題、主に参照)、エラーメッセージはますます大きくなりました。何が起こっているのでしょうか?
編集:ここに失敗していると思われるポストビルドイベントがあります-
xcopy $(ProjectDir)Library\dsoframer.ocx $(TargetDir) /Y /E /D
xcopy $(ProjectDir)ApplicationFiles $(TargetDir) /Y /E /D
xcopy $(SolutionDir)com.myUrl.gwt\www $(TargetDir) /Y /E /D
rmdir /S /Q $(TargetDir).gwt-tmp
Xcopy終了コード4は、「初期化エラーが発生しました。十分なメモリまたはディスク領域がないか、コマンドラインで無効なドライブ名または無効な構文を入力しました。 "
Visual Studioがxcopyに無効な引数を提供しているようです。 Project > Right Click > Properties > Build Events > Post Build Event
でビルド後のイベントコマンドを確認します。
$(ProjectDir)
または同様のマクロ用語が展開されたときに結果のパスにスペースを含む場合は、二重引用符で囲む必要があることに注意してください。例えば:
xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
監視タブを「出力」に切り替えて、xcopyコマンドを探します。ここで、問題の解決に役立つメッセージ(実際のxcopy出力)がさらに見つかる場合があります。出力タブが表示されない場合は、表示-出力メニューを使用して表示します。
受け入れられた答えに加えて、宛先フォルダーが読み取り専用の場合にもエラーが発生する可能性があります(TFSを使用する場合は共通)
ソースファイルが見つからない場合xcopyは、エラーコード4も返します。
Xcopyコマンドが読み取り専用ファイルを上書きしようとしたときに、「exited with code 4」エラーを受け取りました。 xcopyコマンドに/ Rを追加して、この問題を解決しました。 / Rは、 読み取り専用 ファイルを上書きする必要があることを示します
古いコマンド:
XCOPY /E /Y "$(ProjectDir)source file" "destination"
新しいコマンド
XCOPY /E /Y /R "$(ProjectDir)source file" "destination"
他の答えが説明するように、 exit code 4 には多くの原因があります。
結果のパス名が最大許容長を超えている場合に気付きました(ちょうど here のように)。
影響を受けるビルド後イベントのxcopyをrobocopyに置き換えました。 robocopyはわずかに異なるパスを処理するようであり、xcopyが処理できないコピータスクを完了できました。
つまり :
初期化エラーが発生しました。十分なメモリまたはディスク容量がないか、コマンドラインで無効なドライブ名または無効な構文を入力しました。
だから基本的には、何でもいいから笑...コマンドプロンプトから一度に1つずつコマンドを実行して、どのコマンドのどの部分があなたにトラブルを与えているのかを理解してください。
私はこれをメッセージとともに受け取りました
無効なドライブ指定
ドライブ名を指定せずにネットワーク共有にコピーするとき。
xcopy . \\localhost
どこ
xcopy . \\localhost\share
期待されていた
私の場合、問題は誤ったビルド順序によるものでした。あるプロジェクトには、binフォルダーから別のフォルダーにファイルをコピーするためのビルド後イベントにxcopyコマンドがありました。しかし、xcopyの進行中に、誤った依存関係のために、binフォルダーに新しいファイルが作成されていました。
VSで、ビルド後のイベントがあるプロジェクトを右クリックします。 [依存関係の構築]> [プロジェクトの依存関係]に移動し、正しいことを確認します。プロジェクトのビルド順序(依存関係の次のタブ)も確認します。
私はこの問題に出くわしたので、コマンドラインからxcopyコマンドを実行しました。
File creation error - The requested operation cannot be performed on a file with
a user-mapped section open.
実際には、Visual Studioが何かを保持していました。 Visual Studioを再起動しただけで機能しました。
同じ問題がありました。スラッシュがどの方向を指しているかを確認することもできます。私にとっては、スラッシュではなくバックスラッシュを使用するように機能しました。例
xcopy /s /y "C:\SFML\bin\*.dll" "$(OutDir)"
の代わりに:
xcopy /s /y "C:/SFML/bin/*.dll" "$(OutDir)"
VS 2017で更新を行う前に、正常に機能するビルド後のコマンドがありました。SDKツールが更新され、新しいパスにあるため、アセンブリに署名するために使用しているツールが見つかりませんでした。
これはこれから変わりました。..
call "%VS140COMNTOOLS%vsvars32"
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\sn.exe" -Ra "$(TargetPath)" "$(ProjectDir)Key.snk"
これに...
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\sn.exe" -Ra "$(TargetPath)" "$(ProjectDir)Key.snk"
非常に微妙ですが破壊的な変更なので、このエラーが表示された場合は、更新後にパスを確認してください。