Чому крок після збірки (xcopy) іноді виходить із кодом 2 у збірці TeamCity?


93

Кілька проектів у рішенні мого клієнта мають подію після збірки: xcopyвихід збірки до певної папки. Це добре працює при локальному будівництві. Однак у TeamCity я час від часу отримую

xcopy [...] вийшов із кодом 2

Якщо я використовую звичайний copy, він виходить із кодом 1. Я думаю, це має щось спільне із блокуванням файлів, хоча конкретні файли, що копіюються, не однакові, тому, можливо, просто блокування в спільному каталозі призначення. Я використовую, /yщоб не запитувати про перезапис файлів.

Чому це не вдається в TeamCity, але не локально?


У мене були подібні проблеми, але де це пов’язано з паралельним копіюванням одного і того ж файлу. Чи можете ви ще раз перевірити, що жоден файл не копіюється двічі?
Ігнасіо Солер Гарсія,

4
Код виходу 2 означає The user pressed CTRL+C to terminate xcopy. Хе-хе.
Ганс Пассант,

@SoMoS Так, копіювані файли, безумовно, відрізняються.
Тім Айлес,

@HansPassant Я не знаю, чому teamcity хотів би натиснути на мене CTRL + C! :(
Тім Ілес,

5
Так, я теж. Інша загальноприйнята умова полягає в тому, що код виходу дорівнює останній помилці або винятковій ситуації в Windows. Помилка 2 означає "файл не знайдений". Що, звичайно, має набагато більше сенсу.
Ганс Пасант,

Відповіді:


147

Навіть якщо ви надасте /Yкомутатору xcopy, ви все одно отримаєте повідомлення про помилку, коли xcopy не знає, чи копіюєте ви файл чи каталог. Ця помилка відображатиметься як "виведено з кодом 2". Коли ви запускаєте той самий xcopy в командному рядку, ви побачите, що xcopy запитує відповідь файлу або каталогу.

Щоб вирішити цю проблему за допомогою автоматизованої збірки, ви можете відобразити заздалегідь визначену відповідь конвеєром.

Щоб сказати, що ви копіюєте, це файл, повторіть F:

echo F|xcopy /y ...

Щоб сказати, що ви копіюєте, це каталог, повторіть D:

echo D|xcopy /y ...

Іноді вищевказане можна вирішити, просто використовуючи команду копіювання замість xcopy:

copy /y ...

Однак, якщо існують неіснуючі каталоги, що ведуть до кінцевого пункту призначення файлу, тоді відбудеться "вихід із кодом 1".

Пам’ятайте: використовуйте /Cперемикач та xcopy з обережністю.


Дякую @Metro Smurf. Я не можу перевірити, чи вирішило б це мою проблему, але те, що ви говорите, звучить розумно, тому я позначив це як відповідь. На здоров’я!
Tim Iles

Я стикався з точно такою ж проблемою, і в підсумку у відповіді закінчився трубопроводом. Сподіваємось, це допоможе комусь іншому в довгостроковій перспективі.
Metro Smurf

1
"Це не працює в локалізованих версіях Windows, де слова-підказки можуть бути різними. Альтернативний прийом - додати зірочку ' ' до кінця пункту призначення, тоді xcopy не запитуватиме Файл / Каталог. - Govert Jan 28 о 19:40 "Отже, ви можете зробити таку копію без відлуння D (що не є надійним): XCOPY $ (ProjectDir) .. \ scripts * $ (TargetDir) scripts * / Y / R. Або зробіть таку копію без відлуння F: XCOPY D: \ file.zip c: \ renamedFile.zip / Y / R
leetNightshade

@leetNightshade - чи буде *працювати робота і з каталогами? Або це стосується лише файлів?
Metro Smurf

@MetroSmurf Хм, здається, форматування мого прикладу не вдалося, відсутні зворотні скісні риски (мабуть, я думав, що я намагався уникнути символу) і відсутня зірочка. Але так, це працює з каталогами та файлами. Ось посилання на відповідь Govert в: stackoverflow.com/a/14022309/353094
leetNightshade

37

Я виправив код помилки 2, додавши \ в кінці мого шляху, без нього xcopy буде думати, що це файл, а не папка.


3
Це воно. Чудово працював у Windows 7, Visual Studio 2013. Велике спасибі!
Чарльз

33

Якщо ви використовуєте xcopy у події після збірки, використовуйте перемикач / Y на додаток до / C.

/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

2

Моє виправлення для цієї проблеми полягало в тому, щоб зайти в папку цільового кошика та переконатись, що там існує відповідна підпапка. Після створення підпапки вручну процес збірки успішно завершився.


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не вдається його знайти та генерує помилку.

Ви можете додати порожній текстовий файл до порожньої папки, зробити коміт і побачити, що папка з’являється у сховищі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.