Warum wird ein Post-Build-Schritt (xcopy) gelegentlich mit Code 2 in einem TeamCity-Build beendet?

93

Einige Projekte in der Lösung meines Kunden haben ein Post-Build-Ereignis: xcopydie Build-Ausgabe in einen bestimmten Ordner. Dies funktioniert gut, wenn vor Ort gebaut wird. Doch in Teamcity, ich gelegentlich bekommen

xcopy [...] mit Code 2 beendet

Wenn ich "normal" verwende copy, wird es mit Code 1 beendet. Ich gehe davon aus, dass dies etwas mit Dateisperren zu tun hat, obwohl die spezifischen Dateien, die kopiert werden, nicht identisch sind. Vielleicht wird nur das freigegebene Zielverzeichnis gesperrt. Ich benutze, /yum nicht zum Überschreiben von Dateien aufzufordern.

Warum schlägt dies in TeamCity fehl, aber nicht lokal?

Tim Iles
quelle
Ich hatte ähnliche Probleme, bezog mich aber auf das gleichzeitige gleichzeitige Kopieren derselben Datei. Können Sie überprüfen, ob keine Datei zweimal kopiert wurde?
Ignacio Soler Garcia
4
Exit Code 2 bedeutet The user pressed CTRL+C to terminate xcopy. Hehe.
Hans Passant
@SoMoS Ja, die zu kopierenden Dateien sind definitiv unterschiedlich.
Tim Iles
@HansPassant Ich weiß nicht, warum Teamcity STRG + C auf mich drücken möchte! :(
Tim Iles
5
Yah, ich auch nicht. Die andere übliche Konvention ist, dass der Exit-Code dem letzten Windows-Fehler oder der letzten Windows-Ausnahme entspricht. Fehler 2 bedeutet "Datei nicht gefunden". Was natürlich viel sinnvoller ist.
Hans Passant

Antworten:

146

Selbst wenn Sie den /YSwitch mit xcopy versehen, wird immer noch eine Fehlermeldung angezeigt, wenn xcopy nicht weiß, ob es sich bei dem zu kopierenden Objekt um eine Datei oder ein Verzeichnis handelt. Dieser Fehler wird als "mit Code 2 beendet" angezeigt. Wenn Sie dieselbe xcopy an einer Eingabeaufforderung ausführen, werden Sie feststellen, dass xcopy nach einer Antwort der Datei oder des Verzeichnisses fragt.

Um dieses Problem mit einem automatisierten Build zu beheben, können Sie eine vordefinierte Antwort mit einer Pipe wiederholen.

Um zu sagen, dass das, was Sie kopieren, eine Datei ist, geben Sie Folgendes ein F:

echo F|xcopy /y ...

Um zu sagen, dass das, was Sie kopieren, ein Verzeichnis ist, geben Sie Folgendes ein D:

echo D|xcopy /y ...

Manchmal kann das oben genannte Problem gelöst werden, indem einfach ein Kopierbefehl anstelle von xcopy verwendet wird:

copy /y ...

Wenn jedoch nicht vorhandene Verzeichnisse vorhanden sind, die zum endgültigen Dateiziel führen, wird ein "mit Code 1 beendet" angezeigt.

Denken Sie daran: Verwenden Sie den /CSchalter und xcopy mit Vorsicht.

Metro Schlumpf
quelle
Danke @Metro Smurf. Ich kann nicht testen, ob dies mein Problem gelöst hätte, aber was Sie sagen, klingt klug, deshalb habe ich es als Antwort markiert. Prost!
Tim Iles
Ich hatte genau das gleiche Problem und bekam letztendlich Rohrleitungen in der Antwort. Hoffentlich hilft dies auf lange Sicht jemand anderem.
Metro Schlumpf
1
"Dies funktioniert nicht unter lokalisierten Windows-Versionen, bei denen die Eingabeaufforderungswörter möglicherweise unterschiedlich sind. Ein alternativer Trick besteht darin , am Ende des Ziels ein Sternchen ' ' einzufügen, damit xcopy nicht zur Eingabe von Datei / Verzeichnis auffordert. - Govert Jan. 28 um 19:40 "Sie können die Kopie also ohne Echo D (was nicht zuverlässig ist) erstellen: XCOPY $ (ProjectDir) .. \ scripts * $ (TargetDir) scripts * / Y / R. Oder machen Sie die Kopie so ohne Echo F: XCOPY D: \ file.zip c: \ renamedFile.zip / Y / R
leetNightshade
@leetNightshade - *funktioniert das auch mit Verzeichnissen? Oder ist das nur für Dateien?
Metro Schlumpf
@MetroSmurf Hm, anscheinend ist die Formatierung meines Beispiels fehlgeschlagen, es fehlen Backslashes (muss gedacht haben, dass ich versucht habe, einem Symbol zu entkommen) und ein Sternchen fehlt. Aber ja, es funktioniert mit Verzeichnissen und Dateien. Hier ist der Link zu Goverts
leetNightshade
37

Ich habe den Fehlercode 2 durch Hinzufügen eines \ am Ende meines Pfads behoben. Ohne dieses \ wird xcopy denken, dass es sich um eine Datei anstelle eines Ordners handelt.

Benjiko99
quelle
3
Das ist es. Funktionierte einwandfrei unter Windows 7, Visual Studio 2013. Vielen Dank!
Charles
33

Wenn Sie xcopy in einem Post-Build-Ereignis verwenden, verwenden Sie den Schalter / Y zusätzlich zu / C.

/C           Continues copying even if errors occur.
/Y           Suppresses prompting to confirm you want to overwrite an existing file.
DavidS
quelle
4
So einfach! /Yunterdrückt die Eingabeaufforderung! Warum war das so schwer zu finden?
SouthShoreAK
3
/ Y unterdrückt die Überschreibaufforderung, aber dies ist nicht der einzige Grund für einen Code 2. RTFM sagt Ihnen nicht, was sie verursacht.
MSalters
2

Meine Lösung für dieses Problem bestand darin, in den Ziel-Bin-Ordner zu wechseln und sicherzustellen, dass dort der richtige Unterordner vorhanden ist. Nachdem dieser Unterordner manuell erstellt wurde, wurde der Erstellungsprozess erfolgreich abgeschlossen.

Boomer57
quelle
2

copyhabe es für mich behoben. xcopy with /c /yfunktioniert nicht. Ich bekam eine Ausfahrt 4, also ging ich mit xcopy, aber es stellte sich heraus, dass ich Zitate brauchte ($TargetPath).

Mein Skript:

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

Wahrscheinlich verwenden Sie TeamCity mit git. Wenn ja, überprüfen Sie , ob die zu kopierenden Ordner im Git-Repository vorhanden sind. Normalerweise fügt git aviod leere Projektordner zum Repository hinzu, xcopyfindet es also nicht und generiert einen Fehler.

Sie können eine leere Textdatei zum leeren Ordner hinzufügen, festschreiben und sehen, dass der Ordner im Repository angezeigt wird.

iliya
quelle