Копирование команды завершено с кодом 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

Когда вы получаете завершение команды copy с ошибкой code [insert value], обычно это происходит из-за следующего:

  • разрешения на чтение / запись
  • недостающие файлы
  • неправильные каталоги

Однако, очевидно, иногда, когда я строю решение, проблем нет.

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

У вас была такая же проблема и вы решили ее? Или у вас есть какое-нибудь возможное решение?

Ответы:


74

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

Другое решение, которое работает только в 32-битной среде, - это использовать инструмент разблокировки, чтобы освободить дескрипторы окон для файла перед копированием.

Изменить: я только что понял, что он работает под 64-битных тоже.


3
Я добавил параметр / C в приведенную выше команду xcopy, и сборка прошла успешно. Спасибо! Unlocker неоценим в разы.
Мартин С Эк

2
У меня была эта проблема, потому что один из файлов был только для чтения. Как только я это изменил, это сработало.
Боб Хорн

Я также могу засвидетельствовать, что эта проблема решена путем удаления разрешения на чтение только для оскорбительных файлов. У нас есть внешняя папка bin, которая вызывала описанную проблему. После удаления атрибута «только для чтения» ошибка исчезла при попытке построить решение.
eniacAvenger

3
Этот разблокировщик, на который вы указываете, обнаруживается как вирус практически всем. (Google безопасный просмотр материала, eset, virustotal ...). кажется, что обсуждение этого здесь cnet.com/forums/discussions/unlocker-contains-malware-558941
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 для 'Everyone' на моей коробке. Кроме того, вы можете запустить 'start / MIN xcopy ...', чтобы минимизировать мерцание окна
mdisibio

2
Я изменил c: \ windows \ system32 \ xcopy.exe $ (TargetPath) <путь назначения> на c: \ windows \ system32 \ xcopy.exe "$ (TargetPath)" <путь назначения> и не обнаружил проблем за последние 50+ строит.
Pennyrave

1
Я использовал «$ (OutDir) $ (TargetFileName)», его изменение на «$ (TargetPath)» решает проблему. Как и при использовании «Пуск»!
заниматься серфингом

Моя проблема, кажется, исходит от использования символа дефиса в одном из имени родительской папки вместо дефиса. Я сделал ошибку, скопировав / вставив имя папки ветки из слова, что-то вроде «1234 - ABCD». Переименовал его в «1234 - ABCD», и xcopy теперь работает нормально.
Sudeep

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

19

Я пересек ту же ошибку, но это не связано с тем, что файл заблокирован, но файл отсутствует.

Причина, по которой VS пытается скопировать несуществующий файл, заключается в команде события Post-build.

После того, как я это очистил, проблема решена.

ОБНОВИТЬ:

Как заметил @rhughes:

Реальная проблема заключается в том, как заставить команду работать, а не удалять ее.

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

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


1
Если вы копировали файл во время пост-сборки, скорее всего, причина в том, что вы ввели здесь команду. Реальная проблема заключается в том, как заставить команду работать, а не удалять ее.
rhughes

9

Я также столкнулся с этой проблемой. Дважды проверьте результат в окне ошибки.

В моем случае, вылезла из-под \хвоста xcopy (как я и использовал $(TargetDir)). В моем случае $(SolutionDir)..\bin. Если вы используете какой-либо другой выход, это нужно отрегулировать.

Также обратите внимание, что start xcopyэто не исправит, если ошибка исчезла после компиляции. Это могло быть только что подавлено командной строкой, и на самом деле ни один файл не был скопирован!

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


То же самое случилось со мной с $ (OutDir). Кажется, что у всех макросов пути есть «\» в конце, и он вылетает xcopy
Лев Колежук

6

Если событие после сборки содержит команду copy / xcopy для копирования вывода сборки в какой-либо каталог (что обычно является наиболее распространенной операцией после сборки), проблема может возникнуть в том случае, если полный путь к каталогу исходного или целевого назначения содержит имена папок, которые включают пространства. Удалите место для имен каталогов и попробуйте.


5

Как упоминалось на многих сайтах, для этого есть разные причины. Для меня это было связано с длиной источника и назначения (длина пути). Я попытался xcopy в командной строке, и я не смог ввести полный источник и путь (после некоторых символов он не позволит вам набрать). Затем я уменьшил длину пути и смог бежать. Надеюсь это поможет.


4

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


1
Я использую VS как Администратор, но у меня это не сработало.
Арафат

Некоторые пользователи могут не работать в режиме администратора.
MrSpudtastic

3

Я получил эту ошибку, потому что у учетной записи пользователя, под которой работала служба сборки TFS, не было разрешений на запись в папку назначения. Right-click on the folder-->Properties-->Security,


Снимаю шляпу перед «Тангодансером» и или «Абдул Рахман». Щелкните правой кнопкой мыши папку -> Свойства -> Безопасность решила проблему для меня в автономной системе XP SP3. Спасибо

3

Это может произойти в нескольких случаях:

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

2

Я получил эту ошибку, потому что файл был открыт в другом экземпляре.

Когда я закрыл файл и заново собрал решение, оно было успешно скопировано.


2

Я столкнулся с той же проблемой в случае XCOPY после завершения сборки. В моем случае проблема возникла из-за разрешений READ-ONLY для папок.

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

Надеюсь, это поможет кому-то!


2

У меня была такая же ошибка с xcopy в связи с Test Engine. Я использую VisualStudio Professional 2013. По умолчанию Test -> Test Settings -> Keep Test Execution Engine, кажется, является причиной моего кода ошибки 4 с xcopy. Выключение решило проблему. Кажется, что механизм исполнения держит некоторые DLL-файлы.


1

У меня такая же проблема. Простое «Чистое решение» в VS устранило ошибку, но это было временное решение.


Я получаю эту проблему, и «Чистое решение» мне не помогло. «Чистое решение» работает для вас каждый раз?
qxotk

1

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


1

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

exit 0

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

Надеюсь, это поможет кому-то!


1

Если вы используете Windows 7 и более поздние версии, вы можете попробовать новую команду «robocopy»:

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

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


1

Я столкнулся с той же проблемой. Я удалил события после сборки, и он начал работать. Иногда, когда мы добавляем некоторые компоненты SQL, могут также добавляться команды после сборки.


1

Я получаю нечто подобное, используя xcopy с параметром / exclude. В моем случае я обнаружил, что редактирование события после сборки (что-то безобидное, например перевод строки после команды) и сохранение проекта приводят к возникновению ошибки. Повторное сохранение файла, указанного в параметре / exclude, заставляет его снова работать.


1

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

Найдите любой процесс, из которого можно использовать файл, и закройте его.


1

Что исправило это для меня : найдите конкретное решение для проекта, который вы хотите, т.е. НЕ общий файл решения для всех проектов.

Попробуй - я попробовал все остальное, упомянутое здесь, но безрезультатно.


1

Я не вижу здесь ничего, чтобы предположить, что это веб-приложение, но я сам столкнулся с этой проблемой - у меня есть две команды xcopy для события после сборки, и только одна из них завершилась неудачно. Что-то блокировало файл, и это была не Visual Studio (как я пытался перезапустить).

Единственная другая вещь, которая использовала бы dll, который я построил, была IIS. И о чудо,

Простой iisresetсделал свое дело для меня.


1

Я была такая же проблема. Это было вызвано наличием одного и того же флага дважды, например:

if $ (ConfigurationName) == Release (xcopy "$ (TargetDir) . " "$ (SolutionDir) Deployment \ $ (ProjectName) \" / e / d / i / y / e)

Обратите внимание, что флаг "/ e" появляется дважды. Удаление дубликата решило проблему.


1

В моем случае мой $(OutDir)был просто ..\..\Build\некий относительный путь. И, когда я пытался скопировать xcopy /y "$(OutDir)Proj1.dll" "Anypath\anyfolder\"код следующим образом, я получал ошибку кода выхода 4.

Происходило то, что эта команда выполнялась в самом $ (OutDir) (в моем случае папка сборки), а не в каталоге, где был расположен файл 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 сначала сравнивает Source / Dest и только копирует обновленные / новые файлы.

Чтобы обойти это использование:

(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 (из Build Tools for Visual Studio 2019).

Лучшее решение, вероятно, - убедиться, что вам не нужно копировать файлы на этапе после сборки. В некоторых ситуациях вы также можете отключить шаги после сборки при сборке с MSBuild на сервере сборки: https://stackoverflow.com/a/55899347/2279059

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.