Что происходит не так, когда Visual Studio сообщает мне «xcopy завершился с кодом 4»

126

Я не очень хорошо знаком с событиями после сборки, поэтому я немного не понимаю, что не так с моей программой. При компиляции в Visual Studio 2010 я получаю следующее:

The command "xcopy C:\Users\Me\Path\Foo.bar\Library\dsoframer.ocx C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
xcopy C:\Users\Me\Path\Foo.bar\ApplicationFiles C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
xcopy C:\Users\Me\Path\url\ C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
rmdir /S /Q C:\Users\Me\Path\Foo.bar\bin\Debug\.gwt-tmp" exited with code 4.    

Программа представляется для запуска штраф, несмотря на эту ошибку, но я не хочу , чтобы просто игнорировать этот вопрос и надежда ничего плохого не происходит. Как ни странно, эта строка начиналась как одна команда (первая xcopy), но по мере того, как я продолжал компилировать проект (исправляя другие проблемы, в основном ссылки), сообщение об ошибке становилось все больше и больше. Есть идеи, что может происходить?

Изменить: вот события postbuild, которые, похоже, не работают -

xcopy $(ProjectDir)Library\dsoframer.ocx $(TargetDir) /Y /E /D
xcopy $(ProjectDir)ApplicationFiles $(TargetDir) /Y /E /D
xcopy $(SolutionDir)com.myUrl.gwt\www $(TargetDir) /Y /E /D
rmdir /S /Q $(TargetDir).gwt-tmp
Ворон-мечтатель
источник
2
Помимо ответов ниже, также не забудьте открыть VS с помощью Administrator privileges. Для копирования в определенные места требуются права администратора.
Nikhil Agrawal

Ответы:

167

Код выхода 4 Xcopy означает « Произошла ошибка инициализации. Недостаточно памяти или места на диске, либо вы ввели недопустимое имя диска или недопустимый синтаксис в командной строке ».

Похоже, Visual Studio предоставляет недопустимые аргументы для xcopy. Проверьте свою команду события после сборки через Project > Right Click > Properties > Build Events > Post Build Event.

Обратите внимание, что если $(ProjectDir)в результирующих путях в результирующих путях макросов или подобных им есть пробелы, их необходимо заключить в двойные кавычки. Например:

xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
Марк Сидаде
источник
Как я уже сказал, я мало что знаю о сценариях событий после сборки (и я их не писал); где мне это найти?
Raven Dreamer
1
Перейдите в Свойства проекта> События сборки
Марк Сидаде
2
Попробуйте заключить каждую команду в двойные кавычки ( "command args").
Грант Томас
@Mark Cidade - Кажется, у меня нигде нет "События сборки". Перечисленные общие свойства: «Запускаемый проект; зависимости проекта; исходные файлы отладки; параметры анализа кода». Перечисленные свойства конфигурации: «конфигурация».
Raven Dreamer
4
@RavenDreamer: Если $(ProjectDir)(и / или аналогичный) имеет пробелы в расширенном пути, тогда его нужно будет заключить в кавычки. Например:xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
Грант Томас
34

Переключите вкладку часов на «выход» и найдите команду xcopy. Иногда здесь вы можете найти еще одно сообщение (фактический вывод xcopy), которое может помочь вам решить проблему. Если вы не видите вкладку вывода, используйте меню «Просмотр-вывод», чтобы отобразить ее.

Феличе Поллано
источник
30

В дополнение к принятому ответу ошибка также может возникать, когда папка назначения доступна только для чтения (часто при использовании TFS)

Pieter
источник
2
И кое-что вы можете увидеть, если переключитесь в окно вывода как @FelicePollano, упомянутое ниже.
Jedidja 04
20

Если исходный файл не найден, xcopy также возвращает код ошибки 4 .

Der_Meister
источник
3
это был мой случай. я использовал, $(TargetDir)который заканчивается на Release\ . У меня $(ProjectDir)\bin\Release\\
сработало
12

Я получил сообщение об ошибке « Выход с кодом 4 », когда команда xcopy попыталась перезаписать файл, доступный только для чтения. Мне удалось решить эту проблему, добавив / R в команду xcopy. / R указывает только для чтения файлы должны быть перезаписаны

старая команда:

XCOPY /E /Y "$(ProjectDir)source file" "destination"

новая команда

XCOPY /E /Y /R "$(ProjectDir)source file" "destination"
Мартейн
источник
8

Как объясняют другие ответы, код выхода 4 может иметь множество причин.

Я заметил случай, когда результирующие имена путей превышали максимально допустимую длину (как здесь ).

Я заменил xcopy на robocopy для затронутого события сборки поста; Похоже, что robocopy обрабатывает пути немного по-другому и смог выполнить задачу копирования, которую xcopy не смогла обработать.

CodeFox
источник
5

Это означает :

Произошла ошибка инициализации. Недостаточно памяти или места на диске, или вы ввели недопустимое имя диска или недопустимый синтаксис в командной строке.

Так что в основном это может быть что угодно, ха-ха ... попробуйте запустить команду по одной из командной строки, чтобы выяснить, какая часть какой команды вызывает у вас проблемы.

BrandonZeider
источник
3

Я получил это вместе с сообщением

Неверная спецификация диска

при копировании в общий сетевой ресурс без указания имени диска, например

xcopy . \\localhost

где

xcopy . \\localhost\share

ожидалось

Томас Веллер
источник
2

Я столкнулся с этой проблемой, поэтому я запустил команду xcopy из командной строки, и она сказала:

File creation error - The requested operation cannot be performed on a file with
 a user-mapped section open.

На самом деле Visual Studio за что-то держалась. Я только что перезапустил Visual Studio, и все заработало.

NielW
источник
1

В моем случае проблема была связана с неправильным порядком сборки. В одном проекте была команда xcopy для событий после сборки для копирования файлов из папки bin в другую папку. Но из-за неправильных зависимостей новые файлы создавались в папке bin, пока выполняется xcopy.

В VS щелкните правой кнопкой мыши проект, в котором есть события после сборки. Перейдите в Build Dependencies> Project Dependencies и убедитесь, что все правильно. Также проверьте порядок сборки проекта (следующая вкладка в зависимостях).

Sree
источник
1

Эта ошибка возникает из-за наличия пробелов в месте копирования вашего репо. Например, мой проект скопирован в нижеприведенное место, c://projects/My rest project тогда вы можете увидеть белые пробелы там, если вы измените свой путь репо на ниже, он должен работать c://projects/myrestproject

Тушар Мали
источник
0

У меня такая же проблема. Вы также можете проверить, в какую сторону указывает косая черта. Для меня сработало использование обратной косой черты вместо прямой. пример

xcopy /s /y "C:\SFML\bin\*.dll" "$(OutDir)"

Вместо того:

xcopy /s /y "C:/SFML/bin/*.dll" "$(OutDir)"
Марк Дирвен
источник
0

У меня была команда пост-сборки, которая работала нормально до того, как я обновил VS 2017. Оказалось, что инструменты SDK обновились и находились по новому пути, поэтому он не смог найти инструмент, который я использовал для подписи своих сборок.

Это изменилось с этого ....

call "%VS140COMNTOOLS%vsvars32"
    "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\sn.exe" -Ra "$(TargetPath)" "$(ProjectDir)Key.snk"

К этому...

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\sn.exe" -Ra "$(TargetPath)" "$(ProjectDir)Key.snk"

Очень тонкое, но критическое изменение, поэтому проверьте свои пути после обновления, если вы видите эту ошибку.

Fütemire
источник
0

Еще одна вещь , чтобы следить за это двойные обратные косые, так как xcopyне переносит их в параметре ввода пути (но это действительно переносит их в выходной тракт ...).

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

Elaskanator
источник
0

Если какое-либо другое решение находится в режиме отладки, сначала остановите их все, а затем перезапустите визуальную студию. У меня это сработало.

Саван Гадхия
источник
0

Это также может произойти, если целевая папка используется некоторыми другими процессами . Закройте все программы, которые могут использовать целевую папку, и попробуйте.

Вы можете использовать монитор ресурсов (инструмент Windows), чтобы проверить процессы, которые используют вашу целевую папку.

Это сработало для меня !.

Правин кумар
источник