Копія команди, що виходить із кодом 4 під час створення - перезапуск Visual Studio вирішує її


151

Раз у раз, коли я будую тут своє рішення (із 7 проектами в ньому), я отримую жахливу помилку "Команда, що вийшов із кодом 4" у Visual Studio 2010 Premium ed.

Це відбувається через те, що подія після збирання не змогла пройти.

Ось що вирішує проблему тимчасово

  • Іноді: Перезапуск Visual Studio і я в змозі створити рішення
  • Іноді: і перезапуск Visual Studio, і мій менеджер файлів за вибором (Q-Dir 4.37) вирішують це.

Ось як виглядає подія після збирання:

xcopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)" /Y

Коли ви отримуєте копію команди, що вийшов із помилкою коду [ввести значення], це зазвичай відбувається через наступне:

  • дозволи на читання / запис
  • відсутні файли
  • неправильні каталоги

Однак - очевидно, в моменти, коли я будую рішення, проблем немає.

FYI, я видалив ReSharper 5.1.1 два тижні тому, і Visual Studio з тих пір робив мені деякі помилки (серед них неможливо налагодити). Я знову встановив Visual Studio, і з тих пір він працює краще, але все-таки отримаю цю проблему. Можливо, це стосується того, що деякі речі ReSharper знаходяться десь?

У вас була та сама проблема і її вирішили? Або у вас є якесь можливе рішення?

Відповіді:


74

Я незмінно вважав це проблемою блокування файлів. Код 4 - не вдається отримати доступ до файлу. Одне часткове рішення, яке я знайшов, - використовувати параметр / C для xcopy (який продовжується помилково). Насправді не рішення, але, в основному, це зупинило невдачу моїх конструкцій.

Ще одне рішення, яке працює лише на 32-бітному, - використовувати інструмент розблокування , щоб звільнити вікна ручок у файлі перед копією.

Редагувати: Я щойно зрозумів, що він працює і під 64 бітами.


3
До вищевказаної команди xcopy я додав параметр / C і збірка вдалася. Дякую! Unlocker часом неоціненний.
Martin S Ek

2
У мене виникла ця проблема, оскільки один з файлів був лише для читання. Як тільки я це змінив, це спрацювало.
Боб Горн

Я також можу засвідчити, що ця проблема вирішується шляхом видалення лише дозволу на читання, щоб образити файли. У нас є зовнішня папка біна, яка викликала описану проблему. Після того, як я видалив атрибут лише для читання, помилка зникла під час спроби побудувати рішення.
eniacAvenger

3
Цей блокувальник, на який ви вказуєте, виявляється як вірус практично всім. (безпечний перегляд речей Google, eset, virustotal ...). Здається, тут йдеться
v.oddou

Згадайте, скільки років ця відповідь. Вірус, на який ви заявляєте, насправді здається, що це рекламні товари, які зараз, здається, вкладаються в інсталятор, а не в програмне забезпечення, що розблоковує.
Преет Сангха

196

Хоча /Cпомилки можуть ігноруватись, це може бути не справжнім рішенням, оскільки можуть бути файли, ОБОВ'ЯЗКОВІ скопійовані, щоб збірка була успішною.

Найпоширеніша проблема - відсутні цитати навколо заздалегідь визначених командних тегів (наприклад, $TargetDir). Коли ви створюєте різні гілки та контури в коді або TFS, є дуже високий шанс цього статися.

Іноді, якщо файл читається лише він, це також спричинить проблеми. Додайте /Rопцію, щоб дозволити копіювання файлів лише для читання. Список доступних варіантів ви можете знайти за адресою:

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/xcopy.mspx?mfr=true

Інша можлива проблема полягає в тому, що базову папку не можна отримати. Якщо так, спробуйте виконати "start xcopy"замість "xcopy". Це відкриє ще одне вікно команд, але з правами адміністратора.


53
'start' виправив це для мене ... з інших форумів це, здається, є проблемою дозволів, яка 'start' вирішується, навіть незважаючи на те, що призначення має FullControl для 'Усі' у моєму полі. Також ви можете запустити "start / MIN xcopy ...", щоб мінімізувати мерехтіння вікна
mdisibio

2
Я змінив c: \ windows \ system32 \ xcopy.exe $ (TargetPath) <шлях до пункту призначення> на c: \ windows \ system32 \ xcopy.exe "$ (TargetPath)" <шлях призначення> і не маю проблем за останні 50+ будує.
pennyrave

1
Я використав "$ (OutDir) $ (TargetFileName)", змінивши його на "$ (TargetPath)" вирішує проблему. Як і використання 'start'!
surfen

Моя проблема, здається, виникає із використання символу en-dash в одному з назв батьківської папки замість дефісу. Я зробив помилку при копіюванні / вставці назви папки гілки з слова, що було щось на кшталт "1234 - ABCD". Перейменований на "1234 - ABCD", і xcopy зараз працює добре.
Sudeep

додав startі /R, про всяк випадок ... не впевнений, хто з них зробив трюк, але це спрацювало! Дякую!
sǝɯɐſ

19

Я перекреслив ту саму помилку, але це не через те, що файл заблокований, але файл відсутній.

Причина, через яку VS намагався скопіювати неіснуючий файл, полягає в команді події після складання.

Після того, як я це усунув, проблема вирішена.

ОНОВЛЕННЯ:

Як прокоментував @rhughes:

Справжня проблема полягає в тому, як змусити команду працювати тут, а не видаляти її.

і він абсолютно правий.

введіть тут опис зображення


1
Якщо ви копіювали файл під час післязбудови, швидше за все, це тому, що ви тут ввели команду. Справжня проблема полягає в тому, як змусити команду працювати тут, а не видаляти її.
rhughes

9

Я також стикався з цією проблемою. Подвійно перевіряйте результат у вікні помилок.

У моєму випадку \хвіст вибивав з ладу xcopy (як я використовував $(TargetDir)). У моєму випадку $(SolutionDir)..\bin. Якщо ви використовуєте будь-який інший вихід, це потрібно відкоригувати.

Також зауважте, що start xcopyце не виправляється, якщо помилка зникла після компіляції. Можливо, щойно було придушено командним рядком, і жоден файл фактично не був скопійований!

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


Те саме сталося і для мене з $ (OutDir). Здається, що всі макроси шляху мають "\" наприкінці, і він
вибиває

6

Якщо подія збірки пост містить команду copy / xcopy для копіювання виводу збірки в деякий каталог (що зазвичай є найпоширенішою операцією збирання після публікації), проблема може виникнути у випадку, якщо повний шлях до каталогу або до джерела, або до цільових напрямків містить імена папок, які містять пробіли. Видаліть простір для імен (ив) каталогів і спробуйте.


5

Як згадується на багатьох сайтах, для цього є різні причини. Для мене це було пов’язано з довжиною джерела та пункту призначення (довжина шляху). Я спробував xcopy в командному рядку, і мені не вдалося набрати повне джерело та шлях (після деяких символів це не дозволить вам вводити). Потім я зменшив довжину шляху і зміг бігти. Сподіваюся, це допомагає.


4

Запустіть VS в режимі адміністратора, і він повинен працювати нормально.


1
Я працюю VS як адміністратор, але це не спрацювало для мене.
Арафат

Деякі користувачі можуть не мати можливості працювати в режимі адміністратора.
MrSpudtastic

3

Я отримав цю помилку, оскільки обліковий запис користувача, під яким працює служба TFS Build Service, не мав дозволу писати в цільову папку. Right-click on the folder-->Properties-->Security.


Капелюхи відключаються до "Тангодансара" та або "Абдула Рахмана". Клацніть правою кнопкою миші на папці -> Властивості -> Безпека вирішила проблему для мене в самостійній системі XP SP3 Дякую ВАМ

3

Це може статися в декількох випадках:

  1. Коли шлях повного рядка більше 254 символів.
  2. Коли ім'я файлу, який потрібно скопіювати, неправильне.
  3. Коли цільовий шлях невірний.
  4. Коли атрибут readonly встановлений у скопійованому файлі або цільовій папці.

2

Я отримав цю помилку через те, що файл був відкритий в іншому екземплярі.

коли я закрив файл і знову створив рішення, він був успішно скопійований.


2

Я зіткнувся з тим же питанням у випадку XCOPY після того, як буде зроблено збірку. У моєму випадку ця проблема сталася через дозволу ЧИТАТИ НАДАЛЬНО у папках.

Я додав команду attrib -R перед XCOPY, і це вирішило проблему.

Сподіваюся, це комусь допоможе!


2

У мене була така ж помилка з xcopy у зв'язку з Test Engine. Я використовую VisualStudio Professional 2013. За замовчуванням Тест -> Налаштування тестування -> Зберігати запуск тестового виконання двигуна, здається, є причиною мого коду помилки 4 з xcopy. Вимкнення його вирішило проблему. Двигун виконання, здається, тримається на деяких .dlls.


1

У мене була така ж проблема. Простий "Чистий розчин" у VS очистив помилку, але це було тимчасовим рішенням.


У мене з’являється ця проблема, і «Чисте рішення» мені не допомогло. Чи працює "Чистий розчин" для вас кожен раз?
qxotk

1

Я виявив, що встановлення параметра файлу «Копіювати у вихідний каталог» на «Копіювати завжди», здається, усунуло проблему блокування. Хоча зараз у мене є 2 копії файлів і потрібно видалити один.


1

У мене була така ж проблема. Однак мені нічого не вийшло. Я вирішив питання, додавши

exit 0

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

Сподіваюся, це допоможе комусь!


1

Якщо ви працюєте з Windows 7 далі, ви можете спробувати нову команду "robocopy":

robocopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)"

Більше інформації про робокопію можна знайти тут .


1

Я зіткнувся з тим же питанням. Я видалив події після складання, і він почав працювати. Деколи, коли ми додаємо деякі компоненти SQL, вони також можуть додавати команди для побудови.


1

Я отримую щось подібне, використовуючи xcopy з опцією / виключити. У моєму випадку я виявив, що редагування події після складання (щось нешкідливе, як новий рядок після команди) та збереження проекту спричиняє помилку. Повторне збереження файлу, вказаного в опції / виключення, змушує його знову працювати.


1

Коли я пишу бібліотеку DLL, я скористався командою xcopy, щоб скопіювати бібліотеку, куди програма може її знайти та завантажити. Після декількох разів відкриття та закриття програми все ще був відкритий процес її в менеджері завдань, який я не впізнав.

Шукайте будь-який процес, з якого може бути використаний файл, і закрийте його.


1

Що це зафіксувало для мене : перейдіть до конкретного рішення для потрібного проекту, тобто НЕ загальний файл рішення для всіх проектів.

Спробуйте - я спробував усе інше, що згадується тут, але безрезультатно.


1

Я нічого не бачу тут, щоб припустити, що це веб-додаток, але я сам випробував цю проблему - у мене є дві команди xcopy для події після збирання, і лише одна з них вийшла з ладу. Щось було заблоковано у файлі, і це не Visual Studio (як я намагався його перезапустити.)

Єдине, що використовував би побудований dll - IIS. І ось, ось

Простий iisresetзробив трюк для мене.


1

У мене було те саме питання. Це було спричинено тим, що один і той же прапор був двічі, наприклад:

якщо $ (ConfigurationName) == Release (xcopy "$ (TargetDir) . " "$ (SolutionDir) Розгортання \ $ (ProjectName) \" / e / d / i / y / e)

Зауважте, що прапор "/ e" з'являється двічі. Видалення дубліката вирішило проблему.


1

У моєму випадку мій $(OutDir)простий ..\..\Build\шлях, тобто І, коли я намагався скопіювати наступне xcopy /y "$(OutDir)Proj1.dll" "Anypath\anyfolder\" я отримував помилку вихідного коду 4.

Що сталося, ця команда виконувалась у самій $ (OutDir) (у моєму випадку папка build), а не в каталозі, де знаходився файл csproj проекту (як ми зазвичай очікували). Отже, я продовжував отримуватиFile not found помилку (відповідає коду виходу 4).

Я не міг цього зрозуміти, поки не написав cdу подіях Post Build, щоб надрукувати, в якому каталозі це виконується.

Отже, підсумовуючи, якщо ми хочемо copy/ xcopyфайли з файлу $(OutDir), або використовуємо "$(TargetDir)"(що є повним шляхом до вихідного каталогу), або взагалі не потрібно вказувати будь-який шлях.


0

Може бути викликано робочою станцією VMWare зі спільними папками

У мене проблема завжди, коли папка destinatinon xcopy також відображається як Спільна папка у ВМ.

Я вирішив це за допомогою сценарію, запущеного в vm та видалення вмісту спільної папки.


0

Щоб розширити відповідь на регш,

Робокопія працює чудово, просто, якщо вам потрібно включити підкаталоги, які можна використовувати /eдля включення вказівок і копіювання порожніх каталогів або /sвключення підрозділів, виключаючи порожні каталоги.

Також robocopy повідомить про декілька речей, наприклад, якщо нові файли були скопійовані, це призведе до того, що VS скаржиться, оскільки все, що перевищує 0, - це збій, і robocopy поверне 1, якщо нові файли знайдені. Варто зазначити, що робокопія спочатку порівнює джерело / ціль і лише копіює оновлені / нові файли.

Щоб обійти це використання:

(robocopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)") ^& IF %ERRORLEVEL% LEQ 4 exit /B 0

0

Якщо ви знаходитесь тут, тому що ваш проект не може побудувати на сервері збірки, але добре "вручну" створює машину розробників, і ви робите xcopyлише для налагодження та емуляції виробничого середовища на машині розробників, то, можливо, ви захочете подивитися при такому рішенні:

https://stackoverflow.com/a/1732478/2279059

Ви просто вимикаєте події збирання повідомлення на сервері збірки за допомогою

msbuild foo.sln /p:PostBuildEvent=

Це недостатньо добре, якщо у вас є інші події після складання, які також потрібно запустити на сервері збірки, і це не є загальним рішенням. Однак, оскільки існує стільки різних причин цієї проблеми, загального рішення не може бути. Один із численних відповідей на це питання (та його дублікати), ймовірно, допоможе, але будьте обережні з підходами, які лише якось обходять обробку помилок (наприклад, xcopy /C). Вони можуть працювати для вас, особливо також у сценарії побудови сервера, але я думаю, що цей варіант є більш надійним, якщо його можна використовувати.

Також було запропоновано, що з новішими версіями Visual Studio проблема більше не існує, тому, якщо ви використовуєте стару версію, подумайте про оновлення інструментів збирання.


0

Код помилки 4 може означати багато речей, тому я рекомендую також прочитати інші відповіді, поки ви не знайдете рішення, яке працює для вас, і ви не зрозумієте, ЧОМУ це працює (деякі рішення лише відключають обробку помилок, що може лише замаскувати проблему, але не виріши це).

Це може бути проблема блокування файлів, пов’язана з паралельною побудовою. Не можна використовувати паралельну побудову. Це поведінка за замовчуванням, але якщо ви використовуєте -mпараметр, проекти будуватимуться паралельно. Наступні варіанти не повинні створювати проекти паралельно, тому ви не зіткнетесь із проблемою блокування файлів.

msbuild -m:1
msbuild -maxcpucount:1
msbuild

Зауважте, що, всупереч сказаному тут, це відбувається навіть із "останньою" версією MSBuild (з Інструменти побудови для Visual Studio 2019).

Найкраще рішення - це, мабуть, переконатися, що вам не потрібно копіювати файли на етапі після збирання. У деяких ситуаціях ви також можете відключити кроки після збирання при побудові з MSBuild на сервері збірки: https://stackoverflow.com/a/55899347/2279059

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