TeamCity derlemesinde neden bir derleme sonrası adım (xcopy) bazen kod 2 ile çıksın?


94

Müşterimin çözümündeki birkaç projede derleme sonrası olay var: xcopybelirli bir klasöre derleme çıktısı. Bu, yerel olarak inşa ederken iyi çalışıyor. Ancak, TeamCity içinde, ben bazen olsun

xcopy [...] kod 2 ile çıkıldı

Normal kullanırsam copy, kod 1 ile çıkar. Bunun dosya kilitleriyle bir ilgisi olmasını bekliyorum, ancak kopyalanan belirli dosyalar aynı olmasa da, bu yüzden belki sadece paylaşılan hedef dizini kilitliyor. Kullandığım /ydosyalar üzerine değil istemi için.

Bu neden TeamCity'de başarısız olurken yerel olarak başarısız?


Benzer sorunlar yaşadım, ancak aynı dosyayı aynı anda paralel olarak kopyalamakla ilgili. Hiçbir dosyanın iki kez kopyalanmadığını iki kez kontrol edebilir misiniz?
Ignacio Soler Garcia

5
Çıkış kodu 2 anlamına gelir The user pressed CTRL+C to terminate xcopy. Hehe.
Hans Passant 2011

@SoMoS Evet, kopyalanan dosyalar kesinlikle farklı.
Tim Iles 2011

@HansPassant Teamcity'nin neden üzerimde CTRL + C'ye basmak istediğini bilmiyorum! :(
Tim Iles

5
Evet, ben de. Diğer yaygın kural, çıkış kodunun son Windows hatası veya istisnasına eşit olmasıdır. Hata 2, "dosya bulunamadı" anlamına gelir. Elbette ki bu çok daha mantıklı.
Hans Passant 2011

Yanıtlar:


149

/YAnahtarı xcopy ile sağlasanız bile , xcopy kopyaladığınız şeyin bir dosya veya dizin olup olmadığını bilmediğinde yine de bir hata alırsınız. Bu hata "kod 2 ile çıkıldı" olarak görünecektir. Aynı xcopy'yi bir komut isteminde çalıştırdığınızda, xcopy'nin dosya veya dizin yanıtını istediğini göreceksiniz.

Bu sorunu otomatik bir derlemeyle çözmek için, önceden tanımlanmış bir yanıtta bir boru ile yankılanabilirsiniz.

Kopyaladığınız şeyin bir dosya olduğunu söylemek için, içinde yankılayın F:

echo F|xcopy /y ...

Kopyaladığınız şeyin bir dizin olduğunu söylemek için, içinde yankılayın D:

echo D|xcopy /y ...

Bazen yukarıdakiler, xcopy yerine bir kopyalama komutu kullanılarak çözülebilir:

copy /y ...

Ancak, son dosya hedefine giden varolmayan dizinler varsa, "kod 1 ile çıkıldı" ortaya çıkar.

Unutmayın: /Canahtarı ve xcopy'i dikkatli kullanın.


Teşekkürler @Metro Smurf. Bunun sorunumu çözüp çözmeyeceğini test edemem, ama söyledikleriniz akıllıca geliyor, bu yüzden cevap olarak işaretledim. Şerefe!
Tim Iles

Tam olarak aynı problemle karşılaşıyordum ve sonunda yanıtta borularla karşılaştım. Umarım bu uzun vadede başka birine yardımcı olur.
Metro Smurf

1
"Bu, istem sözcüklerinin farklı olabileceği Windows'un yerelleştirilmiş sürümlerinde çalışmaz. Alternatif bir hile, hedefin sonuna bir yıldız işareti ' ' eklemektir , ardından xcopy, Dosya / Dizin'i istemez. - Jan Govert 28 at 19:40 "Yani, kopyalamayı yankı D olmadan yapabilirsiniz (güvenilir değildir): XCOPY $ (ProjectDir) .. \ scripts * $ (TargetDir) scripts * / Y / R. Veya kopyalamayı echo F: XCOPY D: \ file.zip c: \ renamedFile.zip / Y / R
leetNightshade

@leetNightshade - *dizinlerle de çalışacak mı? Yoksa bu sadece dosyalar için mi?
Metro Smurf

@MetroSmurf Hm, örneğimin biçimlendirmesi başarısız görünüyor, eksik ters eğik çizgiler (bir sembolden kaçmaya çalıştığımı düşünmüş olmalıyım) ve yıldız işareti eksik. Ama evet, dizinler ve dosyalarla çalışıyor. Govert'in cevabının bağlantısı: stackoverflow.com/a/14022309/353094
leetNightshade

37

Yolumun sonuna bir \ ekleyerek hata kodu 2'yi düzelttim, o olmadan xcopy bunun bir klasör yerine bir dosya olduğunu düşünecek.


3
Bu kadar. Windows 7, Visual Studio 2013'te gayet iyi çalıştı. Çok teşekkürler!
Charles

33

Bir derleme sonrası olayında xcopy kullanıyorsanız, / C'ye ek olarak / Y anahtarını kullanın.

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

4
Çok basit! /Yistemi bastırır! Bunu bulmak neden bu kadar zordu?
SouthShoreAK

3
/ Y üzerine yazma istemini bastırır, ancak bir kodun 2 nedeni bu değildir. RTFM, onlara neyin sebep olduğunu size söylemez.
MSalters

2

Bu sorunla ilgili düzeltmem, hedef bölme klasörüne gitmek ve orada uygun alt klasörün bulunduğundan emin olmaktı. Bu alt klasör manuel olarak oluşturulduktan sonra, oluşturma süreci başarıyla tamamlandı.


2

copybenim için düzeltti. xcopy with /c /yişe yaramadı. Çıkış 4'e ulaşıyordum, bu yüzden gittim xcopy, ancak etrafta alıntılara ihtiyacım olduğu ortaya çıktı($TargetPath) .

Senaryom:

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

2

Muhtemelen git ile TeamCity kullanıyorsunuz. Evet ise, kopyalamak istediğiniz klasörlerin git deposunda olup olmadığını kontrol edin . Git aviod genellikle depoya boş proje klasörleri ekler, bu nedenle xcopyonu bulamaz ve bir hata oluşturur.

Boş bir klasöre boş metin dosyası ekleyebilir, kaydedebilir ve klasörün depoda göründüğünü görebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.