Mengapa langkah pasca-pembuatan (xcopy) kadang-kadang keluar dengan kode 2 dalam pembuatan TeamCity?

93

Beberapa proyek dalam solusi klien saya memiliki peristiwa pasca-pembangunan: xcopykeluaran pembangunan ke folder tertentu. Ini berfungsi dengan baik saat membangun secara lokal. Namun, di TeamCity, saya terkadang mendapatkannya

xcopy [...] keluar dengan kode 2

Jika saya menggunakan reguler copy, itu keluar dengan kode 1. Saya berharap ini ada hubungannya dengan kunci file, meskipun file spesifik yang disalin tidak sama, jadi mungkin hanya mengunci direktori tujuan bersama. Saya biasanya /ytidak meminta untuk menimpa file.

Mengapa ini gagal di TeamCity tetapi tidak secara lokal?

Tim Iles
sumber
Saya memiliki masalah serupa tetapi terkait dengan menyalin file yang sama secara paralel. Bisakah Anda memeriksa ulang bahwa tidak ada file yang disalin dua kali?
Ignacio Soler Garcia
4
Keluar kode 2 artinya The user pressed CTRL+C to terminate xcopy. Hehe.
Hans Passant
@SoMoS Ya, file yang sedang disalin jelas berbeda.
Tim Iles
@HansPassant Saya tidak tahu mengapa teamcity ingin menekan CTRL + C pada saya! :(
Tim Iles
5
Yah, aku juga tidak. Ketentuan umum lainnya adalah bahwa kode keluar sama dengan kesalahan atau pengecualian Windows terakhir. Error 2 berarti "file tidak ditemukan". Yang tentu saja lebih masuk akal.
Hans Passant

Jawaban:

147

Bahkan jika Anda menyediakan /Yswitch dengan xcopy, Anda masih akan mendapatkan kesalahan saat xcopy tidak tahu apakah yang Anda salin adalah file atau direktori. Kesalahan ini akan muncul sebagai "keluar dengan kode 2". Saat Anda menjalankan xcopy yang sama pada prompt perintah, Anda akan melihat bahwa xcopy meminta tanggapan dari file atau direktori.

Untuk mengatasi masalah ini dengan build otomatis, Anda dapat menggemakan respons yang ditentukan sebelumnya dengan pipa.

Untuk mengatakan hal yang Anda salin adalah file, gema di F:

echo F|xcopy /y ...

Untuk mengatakan hal yang Anda salin adalah direktori, gema di D:

echo D|xcopy /y ...

Terkadang hal di atas dapat diselesaikan hanya dengan menggunakan perintah salin alih-alih xcopy:

copy /y ...

Namun, jika tidak ada direktori yang mengarah ke tujuan file akhir, maka "keluar dengan kode 1" akan terjadi.

Ingat: gunakan /Csakelar dan xcopy dengan hati-hati.

Metro Smurf
sumber
Terima kasih @Metro Smurf. Saya tidak dapat menguji apakah ini akan menyelesaikan masalah saya, tetapi apa yang Anda katakan terdengar pintar jadi saya menandainya sebagai jawabannya. Bersulang!
Tim Iles
Saya mengalami masalah yang persis sama dan akhirnya berakhir dengan perpipaan dalam respons. Semoga ini akan membantu orang lain dalam jangka panjang.
Metro Smurf
1
"Ini tidak bekerja pada versi Windows yang dilokalkan, di mana kata-kata prompt mungkin berbeda. Trik alternatifnya adalah dengan menambahkan tanda bintang ' ' di akhir tujuan, lalu xcopy tidak akan meminta File / Direktori. - Govert Jan 28 jam 19:40 "Jadi, Anda dapat melakukan penyalinan seperti ini tanpa echo D (yang tidak dapat diandalkan): XCOPY $ (ProjectDir) .. \ scripts * $ (TargetDir) scripts * / Y / R. Atau lakukan penyalinan seperti ini tanpa echo F: XCOPY D: \ file.zip c: \ renamedFile.zip / Y / R
leetNightshade
@leetNightshade - akankah *berfungsi dengan direktori juga? Atau ini hanya untuk file?
Metro Smurf
@MetroSmurf Hm, sepertinya format contoh saya gagal, ada garis miring terbalik yang hilang (pasti mengira saya mencoba melarikan diri dari simbol) dan tanda bintang hilang. Tapi ya, ini berfungsi dengan direktori dan file. Berikut tautan ke jawaban Govert: stackoverflow.com/a/14022309/353094
leetNightshade
37

Saya memperbaiki kode kesalahan 2 dengan menambahkan \ di ujung jalur saya, tanpa itu, xcopy akan berpikir bahwa itu adalah file, bukan folder.

Benjiko99
sumber
3
Itu dia. Bekerja dengan baik di Windows 7, Visual Studio 2013. Terima kasih banyak!
Charles
33

Jika Anda menggunakan xcopy dalam event post build gunakan tombol / Y selain / C.

/C           Continues copying even if errors occur.
/Y           Suppresses prompting to confirm you want to overwrite an existing file.
DavidS
sumber
4
Sangat sederhana! /Ymenekan prompt! Mengapa ini sangat sulit ditemukan?
SouthShoreAK
3
/ Y tidak menekan prompt timpa, tetapi itu bukan satu-satunya alasan untuk kode 2. RTFM tidak akan memberi tahu Anda apa penyebabnya.
MSalters
2

Perbaikan saya untuk masalah ini adalah masuk ke folder target bin, dan memastikan bahwa subfolder yang tepat ada di sana. Setelah subfolder itu dibuat secara manual, proses build berhasil diselesaikan.

boomer57
sumber
2

copymemperbaikinya untuk saya. xcopy with /c /ytidak bekerja. Saya mendapatkan jalan keluar 4 jadi saya pergi dengan xcopy, tetapi ternyata saya membutuhkan kutipan ($TargetPath).

Skrip saya:

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

Mungkin Anda menggunakan TeamCity dengan git. Jika ya, periksa apakah folder yang ingin Anda salin ada di repositori git. Biasanya git aviod menambahkan folder proyek kosong ke repositori, jadi xcopygagal menemukannya dan menghasilkan kesalahan.

Anda dapat menambahkan beberapa file teks kosong ke folder kosong, komit dan melihat folder muncul di repositori.

iliya
sumber