TeamCityビルドでビルド後のステップ(xcopy)がコード2で時々終了するのはなぜですか?


93

クライアントのソリューションのいくつかのプロジェクトには、ビルド後のイベントがありxcopyます。特定のフォルダーへのビルド出力です。ローカルでビルドする場合、これは正常に機能します。しかし、チームシティーでは、私が時折取得します

xcopy [...]はコード2で終了しました

regularを使用copyすると、コード1で終了します。これは、ファイルのロックと関係があると思いますが、コピーされる特定のファイルは同じではないため、おそらく共有の宛先ディレクトリをロックするだけです。私が使用して/yファイルを上書きするには、プロンプトしないように。

なぜこれはTeamCityでは失敗するがローカルでは失敗しないのですか?


同じような問題がありましたが、同じファイルを同時に並行してコピーすることに関連しています。ファイルが2回コピーされていないことをもう一度確認してください。
Ignacio Soler Garcia

4
終了コード2はを意味しThe user pressed CTRL+C to terminate xcopyます。へへ。
ハンスパッサン、2011年

@SoMoSはい、コピーされるファイルは明確に異なります。
Tim Iles、2011年

@HansPassant teamcityがCTRL + Cを押したくなる理由がわかりません!:(
Tim Iles

5
うん、私も。他の一般的な規則は、終了コードが最後のWindowsエラーまたは例外と等しいことです。エラー2は「ファイルが見つかりません」を意味します。もちろん、どちらがより理にかなっていますか。
ハンスパッサン、2011年

回答:


146

あなたが提供する場合であっても/YXCOPYでスイッチを使用すると、コピーしているものは、ファイルまたはディレクトリである場合XCOPYがわからないとき、あなたはまだエラーが発生します。このエラーは「コード2で終了しました」として表示されます。コマンドプロンプトで同じxcopyを実行すると、xcopyがファイルまたはディレクトリの応答を要求していることがわかります。

自動ビルドでこの問題を解決するには、事前定義された応答をパイプでエコーすることができます。

コピーしているのがファイルであると言うには、次のようにエコーしFます。

echo F|xcopy /y ...

コピーしているのがディレクトリであると言うには、次のようにエコーしDます。

echo D|xcopy /y ...

xcopyの代わりにcopyコマンドを使用するだけで上記の問題が解決する場合があります。

copy /y ...

ただし、最終的なファイルの宛先に至るまで存在しないディレクトリがある場合、「コード1で終了」が発生します。

/C注意:スイッチとxcopyは注意して使用してください。


@Metro Smurfに感謝します。これで問題が解決したかどうかをテストすることはできませんが、あなたの言うことは賢明に聞こえるので、答えとしてマークしました。乾杯!
Tim Iles、2013

私はまったく同じ問題に遭遇し、最終的には応答のパイプになってしまいました。うまくいけば、これは長期的には誰かを助けるでしょう。
メトロスマーフ2013

1
「これは、プロンプトの単語が異なる可能性があるローカライズ版のWindowsでは機能しません。別の方法として、宛先の末尾にアスタリスク「」を追加すると、xcopyがファイル/ディレクトリの入力を求めません。– Govert Jan 28 at 19:40 "したがって、エコーD(信頼できない)なしで次のようにコピーできます:XCOPY $(ProjectDir).. \ scripts * $(TargetDir)scripts * / Y / R。または、エコーなしで次のようにコピーしますF:XCOPY D:\ file.zip c:\ renamedFile.zip / Y / R
leetNightshade

@leetNightshade- *ディレクトリでも機能しますか?それともファイル専用ですか?
メトロスマーフ2013

@MetroSmurfええと、私の例のフォーマットが失敗したようです。バックスラッシュ(シンボルをエスケープしようとしていると考えていたはずです)とアスタリスクがありません。しかし、はい、それはディレクトリとファイルで動作します。ここでGovertの答えへのリンクがあります:stackoverflow.com/a/14022309/353094
leetNightshade

37

パスの最後に\を追加してエラーコード2を修正しました。これがないと、xcopyはフォルダーではなくファイルと見なします。


3
それでおしまい。Windows 7、Visual Studio 2013で問題なく動作しました。どうもありがとうございました。
Charles

33

ビルド後のイベントでxcopyを使用している場合は、/ Cに加えて/ Yスイッチを使用します。

/C           Continues copying even if errors occur.
/Y           Suppresses prompting to confirm you want to overwrite an existing file.

4
とても簡単!/Yプロンプトを抑制します!なぜこれを見つけるのが難しいのですか?
SouthShoreAK

3
/ Yは上書きプロンプトを抑制しますが、それがコード2の唯一の理由ではありません。RTFMは何が原因であるかを通知しません。
MSalters 2013年

2

この問題に対する私の修正は、ターゲットbinフォルダーに移動し、適切なサブフォルダーがそこに存在することを確認することでした。そのサブフォルダーが手動で作成されると、ビルドプロセスは正常に完了しました。


2

copy私のために修正しました。xcopy with /c /y動作しませんでした。私は出口4を取得していたので、私は行きましたがxcopy、周りに引用符が必要であることがわかりました($TargetPath)

私のスクリプト:

if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"

2

おそらくTeamCityをgitで使用しています。はいの場合は、コピーするフォルダがgitリポジトリに存在することを確認してください。通常、git aviodは空のプロジェクトフォルダをリポジトリに追加するため、それxcopyを見つけることができず、エラーが発生します。

空のテキストファイルを空のフォルダに追加してコミットし、フォルダがリポジトリに表示されることを確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.