Що відбувається не так, коли Visual Studio каже мені "xcopy вийшов з кодом 4"


125

Я не дуже знайомий з подіями після збирання, тому я трохи розгублений, що не так у моїй програмі. При складанні у візуальній студії 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), але коли я продовжував складати проект (виправляючи інші проблеми, в основному посилання), повідомлення про помилку розширювалося все більше і більше. Будь-яка ідея, що може йти?

Редагувати: Ось події після побудови, які, здається, не вдається -

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

Відповіді:


166

Код виходу Xcopy 4 означає " Виникла помилка ініціалізації. Не вистачає пам'яті чи дискового простору, або ви ввели в командному рядку неправильне ім'я диска або недійсний синтаксис. "

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

Зауважте, що якщо у $(ProjectDir)схожих макрокомандах є пробіли в отриманих контурах при розширенні, їх потрібно буде загортати в подвійні лапки. Наприклад:

xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1

Як я вже говорив, я мало знаю про сценарії подій після збирання (і я їх не писав); де я це знаходжу?
Сонник ворона

1
Перейдіть до проекту Властивості> Побудувати події
Марк Сідаде

2
Спробуйте обернути кожну команду подвійними лапки ( "command args").
Грант Томас

@Mark Cidade - Я, здається, ніде не маю "Побудувати події". Перелічені загальні властивості: "Проект запуску; Залежності проекту; Файли вихідних помилок; Параметри аналізу коду". Перелічені властивості конфігурації: "конфігурація".
Сонник ворона

4
@RavenDreamer: Якщо у $(ProjectDir)(та / або подібному) є пробіли в розширеному шляху, його потрібно буде загорнути в лапки. Наприклад:xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
Грант Томас

34

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


30

На додаток до прийнятої відповіді, помилка може виникнути і тоді, коли папка призначення призначена лише для читання (поширена при використанні TFS)


2
І щось ви можете побачити, якщо перейти до вікна виводу, як @FelicePollano, зазначене нижче.
Jedidja

20

Якщо вихідний файл не знайдено, xcopy також повертає код помилки 4 .


3
це був мій випадок. Я використав, $(TargetDir)що закінчується с Release\ . Використання $(ProjectDir)\bin\Releaseбез останнього \\ працювало для мене
Multinerd

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 для події, яка склалася після створення збірки; Робокопія, здається, обробляє контури трохи по-іншому, і змогла виконати завдання копіювання, з яким xcopy не змогла впоратися.


5

Це означає :

Виникла помилка ініціалізації. Не вистачає пам'яті чи дискового простору, або ви ввели в командному рядку неправильне ім’я диска або недійсний синтаксис.

Так що в основному це може бути майже все, що завгодно ... спробуйте запустити команду по черзі з командного рядка, щоб з'ясувати, яка частина команди дає вам проблеми.


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, і це спрацювало.


1

У моєму випадку проблема сталася через неправильний порядок складання. Один проект мав команду xcopy на події після збирання для копіювання файлів із папки бін в іншу папку. Але через неправильні залежності нові файли створювались у папці bin під час роботи xcopy.

У VS клацніть правою кнопкою миші на проекті, де у вас є події після складання. Перейдіть до «Створення залежностей»> «Залежності проекту» та переконайтесь, що він правильний. Перевірте також порядок побудови проекту (наступна вкладка залежностей).


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

У мене була команда "post build", яка працювала чудово, перш ніж я оновлював 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"

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


0

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

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


0

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


0

Це також може відбутися, якщо цільова папка використовується деякими іншими процесами . Закрийте всі програми, які можуть використовувати цільову папку, і спробуйте.

Ви можете використовувати монітор ресурсів (інструмент Windows) для перевірки процесів, які використовують вашу цільову папку.

Це працювало на мене !.

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