Kopiowanie polecenia zostało zakończone z kodem 4 podczas kompilowania - ponowne uruchomienie programu Visual Studio rozwiązuje problem

151

Od czasu do czasu, gdy buduję tutaj swoje rozwiązanie (z 7 projektami), pojawia się przerażający błąd „Kopia polecenia została zakończona z kodem 4” w programie Visual Studio 2010 Premium ed.

Dzieje się tak, ponieważ nie można przejść przez zdarzenie po kompilacji.

Oto, co tymczasowo rozwiązuje problem

  • Czasami: ponowne uruchomienie programu Visual Studio i mogę zbudować rozwiązanie
  • Czasami: rozwiązuje problem zarówno ponowne uruchomienie programu Visual Studio, jak i mojego wybranego menedżera plików (Q-Dir 4.37).

Oto jak wygląda wydarzenie post-build:

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

Kiedy otrzymujesz polecenie kopiowania zakończone z błędem kodu [wstaw wartość], zwykle dzieje się tak z następujących powodów:

  • uprawnienia do odczytu / zapisu
  • brakujące pliki
  • złe katalogi

Jednak - oczywiście, gdy buduję rozwiązanie, nie ma problemu.

Do Twojej wiadomości, odinstalowałem ReSharper 5.1.1 dwa tygodnie temu i od tego czasu Visual Studio daje mi kilka błędów (między innymi brak możliwości debugowania). Ponownie zainstalowałem program Visual Studio i od tego czasu działa lepiej, ale nadal mam ten problem. Czy może to mieć coś wspólnego z tym, że gdzieś są jakieś rzeczy ReSharper?

Czy miałeś ten sam problem i rozwiązałeś go? Czy masz jakieś możliwe rozwiązanie tego problemu?

Martin S Ek
źródło

Odpowiedzi:

74

Zawsze uważałem, że jest to problem z blokowaniem plików. Kod 4 nie może uzyskać dostępu do pliku. Jednym z częściowych rozwiązań, które znalazłem, jest użycie opcji / C dla xcopy (która jest kontynuowana w przypadku błędu). Niezupełnie rozwiązanie, ale przede wszystkim powstrzymało moje kompilacje przed niepowodzeniem.

Innym rozwiązaniem, które działa tylko na 32 bit jest użycie unlocker narzędzie, aby zwolnić uchwyty okien na pliku przed kopii.

Edycja: właśnie zdałem sobie sprawę, że działa również na 64 bitach.

Preet Sangha
źródło
3
Dodałem opcję / C do powyższego polecenia xcopy i budowa powiodła się. Dzięki! Unlocker jest czasami nieoceniony.
Martin S Ek
2
Miałem ten problem, ponieważ jeden z plików był tylko do odczytu. Kiedy to zmieniłem, zadziałało.
Bob Horn
Mogę również zaświadczyć, że problem ten został rozwiązany poprzez usunięcie uprawnień tylko do odczytu dla plików naruszających prawa. Mamy zewnętrzny folder bin, który był przyczyną opisanego problemu. Po usunięciu atrybutu tylko do odczytu błąd zniknął podczas próby zbudowania rozwiązania.
eniacAvenger
3
Ten program do odblokowywania, na który wskazujesz, jest wykrywany jako wirus przez prawie wszystko. (Bezpieczne przeglądanie w Google, eset, virustotal ...). Wydaje się, że dyskusję o tym tutaj cnet.com/forums/discussions/unlocker-contains-malware-558941
v.oddou
Pamiętaj, ile lat ma ta odpowiedź. Wirus, o którym się twierdzisz, wydaje się być programem reklamowym, który teraz wydaje się być dołączony do instalatora, a nie do samego oprogramowania odblokowującego.
Preet Sangha
196

Chociaż /Cmoże ignorować błędy, może nie być prawdziwym rozwiązaniem, ponieważ mogą istnieć pliki, które MUSZĄ zostać skopiowane, aby kompilacja się powiodła.

Najczęstszym problemem są brakujące cudzysłowy wokół wstępnie zdefiniowanych tagów poleceń (takich jak $TargetDir). Kiedy tworzy się różne gałęzie i ścieżki w kodzie lub TFS, istnieje bardzo duża szansa, że ​​tak się stanie.

Czasami, jeśli plik jest tylko do odczytu, spowoduje to również problemy. Dodaj /Ropcję zezwalającą na kopiowanie plików tylko do odczytu. Listę dostępnych opcji można znaleźć pod adresem:

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

Innym możliwym problemem jest to, że nie można uzyskać dostępu do podstawowego folderu. Jeśli tak, spróbuj wykonać "start xcopy"zamiast "xcopy". Otworzy się kolejne okno poleceń, ale z uprawnieniami administratora.

Vemul
źródło
53
„start” naprawił to dla mnie… z innych forów wydaje się, że jest to problem z uprawnieniami, który „start” rozwiązuje, mimo że miejsce docelowe ma FullControl dla „wszystkich” na moim komputerze. Możesz także uruchomić polecenie „start / MIN xcopy ...”, aby zminimalizować migotanie okna
mdisibio,
2
Zmieniłem c: \ windows \ system32 \ xcopy.exe $ (TargetPath) <ścieżka docelowa> na c: \ windows \ system32 \ xcopy.exe "$ (TargetPath)" <ścieżka docelowa> i nie mam żadnych problemów w ostatnich 50+ buduje.
pennyrave
1
Użyłem „$ (OutDir) $ (TargetFileName)”, zmieniając go na „$ (TargetPath)” rozwiązuje problem. Podobnie jak użycie „start”!
surfen
Wydaje się, że mój problem wynika z używania znaku półpasku w jednej z nazw folderów nadrzędnych zamiast łącznika. Popełniłem błąd kopiując / wklejając nazwę folderu oddziału ze Worda, czyli coś w rodzaju „1234 - ABCD”. Zmieniono jego nazwę na „1234 - ABCD” i xcopy działa teraz dobrze.
Sudeep,
dodano starti na /Rwszelki wypadek ... nie jestem pewien, który z nich załatwił sprawę, ale zadziałał! Dzięki!
sǝɯɐſ
19

Przekroczyłem ten sam błąd, ale nie jest to spowodowane tym, że plik jest zablokowany, ale brakuje pliku.

Przyczyną, dla której VS próbował skopiować nieistniejący plik, jest polecenie zdarzenia po kompilacji.

Gdy to wyjaśniłem, problem został rozwiązany.

AKTUALIZACJA:

Jak skomentował @rhughes:

Prawdziwym problemem jest raczej to, jak sprawić, by polecenie działało, a nie je usunąć.

i ma całkowitą rację.

wprowadź opis obrazu tutaj

ValidfroM
źródło
1
Jeśli kopiowałeś plik podczas post-kompilacji, prawdopodobnie powodem jest to, że wprowadziłeś tutaj polecenie. Prawdziwym problemem jest raczej to, jak sprawić, by polecenie działało, a nie je usunąć.
rhughes
9

Ja też napotkałem ten problem, dwukrotnie sprawdź wynik w oknie błędu.

W moim przypadku tailing \powodował awarię xcopy (tak jak ja $(TargetDir)). W moim przypadku $(SolutionDir)..\bin. Jeśli używasz innego wyjścia, musisz to zmienić.

Należy również pamiętać, że start xcopynie naprawia tego, jeśli błąd zniknął po kompilacji. Mogło zostać po prostu zablokowane przez linię poleceń i żaden plik nie został skopiowany!

Możesz btw ręcznie wykonywać polecenia xcopy w powłoce poleceń. Więcej szczegółów uzyskasz, wykonując je tam, wskazując ci właściwy kierunek.

ElGauchooo
źródło
To samo stało się ze mną z $ (OutDir). Wygląda na to, że wszystkie makra ścieżki mają na końcu znak „\” i powoduje awarię xcopy
Leo Kolezhuk
6

W przypadku, gdy zdarzenie po kompilacji zawiera polecenie copy / xcopy do kopiowania danych wyjściowych kompilacji do jakiegoś katalogu (co zwykle jest najczęstszą operacją po kompilacji), problem może wystąpić w przypadku, gdy pełna ścieżka katalogu źródłowego lub docelowego zawiera nazwy folderów, które obejmują przestrzenie. Usuń miejsce na nazwy katalogów i spróbuj.

akka16
źródło
5

Jak wspomniano w wielu witrynach, jest tak z różnych powodów. Dla mnie było to spowodowane długością Źródła i Przeznaczenia (Długość Ścieżki). Próbowałem xcopy w wierszu polecenia i nie mogłem wpisać pełnego źródła i ścieżki (po niektórych znakach nie pozwala to na wpisanie). Następnie zmniejszyłem długość ścieżki i mogłem biec. Mam nadzieję że to pomoże.

Ganesh Patil
źródło
4

Uruchom VS w trybie administratora i powinno działać dobrze.

Satyen
źródło
1
Używam VS jako administrator, ale to nie zadziałało.
Arafat
Niektórzy użytkownicy mogą nie być w stanie uruchomić w trybie administratora.
MrSpudtastic
3

Wystąpił ten błąd, ponieważ konto użytkownika, na którym była uruchomiona usługa kompilacji TFS, nie miało uprawnień do zapisu w folderze docelowym. Right-click on the folder-->Properties-->Security.

Tangodancer
źródło
Czapki z głów przed „Tangodancer” i „Abdul Rahman”. Kliknij prawym przyciskiem myszy folder -> Właściwości -> Bezpieczeństwo rozwiązało problem za mnie na samodzielnym systemie XP SP3 Dziękuję CI
3

Może się to zdarzyć w wielu przypadkach:

  1. Gdy pełna ścieżka ciągu jest dłuższa niż 254 znaków.
  2. Gdy nazwa pliku do skopiowania jest nieprawidłowa.
  3. Kiedy ścieżka docelowa jest zła.
  4. Gdy atrybut tylko do odczytu jest ustawiony dla skopiowanego pliku lub folderu docelowego.
Srihari Chinna
źródło
2

Otrzymałem ten błąd, ponieważ plik został otwarty w innej instancji.

kiedy zamknąłem plik i ponownie zbudowałem rozwiązanie, zostało ono pomyślnie skopiowane.

Aditya Reddy
źródło
2

Napotkałem ten sam problem w przypadku XCOPY po zakończeniu kompilacji. W moim przypadku problem występował z powodu uprawnień TYLKO DO ODCZYTU ustawionych dla folderów.

Dodałem polecenie attribute -R przed XCOPY i rozwiązałem problem.

Mam nadzieję, że to komuś pomoże!

Asad
źródło
2

Miałem ten sam błąd z xcopy w związku z silnikiem testowym. Używam VisualStudio Professional 2013. Domyślnie Test -> Ustawienia testu -> Utrzymaj uruchomiony silnik wykonywania testów wydaje się być przyczyną mojego kodu błędu 4 z xcopy. Wyłączenie go rozwiązało problem. Wydaje się, że silnik wykonawczy zachowuje niektóre pliki dll.

fabiański
źródło
1

Miałem ten sam problem. Proste „czyste rozwiązanie” w VS usunęło błąd, ale było to rozwiązanie tymczasowe.

Doigen
źródło
Pojawia się ten problem, a „Czyste rozwiązanie” mi nie pomogło. Czy „Clean Solution” działa dla Ciebie za każdym razem?
qxotk
1

Zauważyłem, że ustawienie parametru Kopiuj do katalogu wyjściowego pliku na Zawsze kopiuj wydaje się rozwiązać problem z blokowaniem. Chociaż teraz mam 2 kopie plików i muszę jeden usunąć.

user432404
źródło
1

Miałem ten sam problem. Jednak nic mi nie pomogło. Rozwiązałem problem, dodając

exit 0

do mojego kodu. Problem polegał na tym, że podczas kopiowania plików czasami nie można było znaleźć ostatniego pliku, a bat zwracał wartość niezerową.

Mam nadzieję, że to komuś pomoże!

XMight
źródło
1

Jeśli używasz systemu Windows 7 w nowszych wersjach, możesz wypróbować nowe polecenie „robocopy”:

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

Więcej informacji o robocopy można znaleźć tutaj .

rhughes
źródło
1

Napotkałem ten sam problem. Usunąłem wydarzenia po kompilacji i zaczęło działać. Czasami, gdy dodajemy niektóre komponenty SQL, może również dodawać polecenia po kompilacji.

Człowiek Pająk
źródło
1

Otrzymuję coś podobnego za pomocą xcopy z opcją / exclude. W moim przypadku stwierdziłem, że edycja zdarzenia po kompilacji (coś nieszkodliwego jak nowa linia po poleceniu) i zapisanie projektu powoduje wystąpienie błędu. Ponowne zapisanie pliku określonego w opcji / exclude powoduje, że znów działa.

Neil
źródło
1

Podczas pisania biblioteki DLL użyłem polecenia xcopy, aby skopiować bibliotekę, w której program może ją znaleźć i załadować. Po kilkukrotnym otwieraniu i zamykaniu programu w Taskmanager nadal był otwarty proces, którego nie rozpoznałem.

Poszukaj dowolnego procesu, z którego można użyć pliku, i zamknij go.

CanO
źródło
1

Co mnie rozwiązało : przejdź do konkretnego rozwiązania dla projektu, który chcesz, tj. NIE do ogólnego pliku rozwiązania dla wszystkich projektów.

Spróbuj - próbowałem wszystkiego innego, o czym tutaj wspomniano, ale bezskutecznie.

arush436
źródło
1

Nie widzę tu nic, co sugerowałoby, że jest to aplikacja internetowa, ale sam doświadczyłem tego problemu - mam dwa polecenia xcopy na zdarzeniu po kompilacji i tylko jedno z nich zawodziło. Coś zablokowało plik i to nie był program Visual Studio (ponieważ próbowałem go ponownie uruchomić).

Jedyną inną rzeczą, która wykorzystałaby zbudowaną przeze mnie bibliotekę dll, były IIS. A oto i oto

Prosty iisresetzałatwił mi sprawę.

BinaryTony
źródło
1

Miałem ten sam problem. Było to spowodowane dwukrotnym posiadaniem tej samej flagi, na przykład:

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

Zauważ, że flaga „/ e” pojawia się dwukrotnie. Usunięcie duplikatu rozwiązało problem.

sapbucket
źródło
1

W moim przypadku $(OutDir)była to po prostu ..\..\Build\np. Jakaś względna ścieżka. A kiedy próbowałem skopiować plik xcopy w następujący sposób xcopy /y "$(OutDir)Proj1.dll" "Anypath\anyfolder\", otrzymywałem błąd kodu zakończenia 4.

Co się działo, to polecenie było wykonywane w samym katalogu $ (OutDir) (w moim przypadku w folderze build), a nie w katalogu, w którym znajdował się plik csproj projektu (jak zwykle byśmy się tego spodziewali). W związku z tym ciągle otrzymywałem File not foundbłąd (odpowiadający kodowi zakończenia 4).

Nie mogłem tego rozgryźć, dopóki nie napisałem cdw wydarzeniach związanych z post-kompilacją, aby wydrukować, w którym katalogu jest to wykonywane.

Podsumowując, jeśli chcemy copy/ xcopypliki z katalogu $(OutDir), albo użyj "$(TargetDir)"(co jest pełną ścieżką do katalogu wyjściowego), albo nie musisz określać żadnej ścieżki.

Hussain Mir
źródło
0

Może to być spowodowane stacją roboczą VMWare z udostępnionymi folderami

Mam problem zawsze, gdy folder docelowy xcopyjest również mapowany jako folder współdzielony na maszynie wirtualnej.

Rozwiązałem to za pomocą skryptu uruchomionego w maszynie wirtualnej i usuwając zawartość udostępnionego folderu.

trzęsienie ziemi
źródło
0

Aby rozwinąć odpowiedź Rhughes,

Robocopy działa pięknie, po prostu na wypadek, gdybyś musiał uwzględnić podkatalogi, których możesz użyć /edo włączenia subskrypcji i skopiowania pustych katalogów lub /sdo uwzględnienia subskrypcji z wyłączeniem pustych katalogów.

Robocopy zgłosi również kilka rzeczy, takich jak skopiowanie nowych plików, co spowoduje narzekanie VS, ponieważ wszystko powyżej 0 oznacza błąd, a robocopy zwróci 1, jeśli zostaną znalezione nowe pliki. Warto wspomnieć, że robocopy najpierw porównuje źródło / cel i kopiuje tylko zaktualizowane / nowe pliki.

Aby obejść ten problem, użyj:

(robocopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)") ^& IF %ERRORLEVEL% LEQ 4 exit /B 0
Andy Braham
źródło
0

Jeśli jesteś tutaj, ponieważ twój projekt nie buduje się na serwerze kompilacji, ale tworzy się dobrze "ręcznie" na maszynie deweloperskiej, a robisz xcopytylko debugowanie i emulowanie środowiska produkcyjnego na maszynie deweloperskiej, możesz chcieć spojrzeć przy tym rozwiązaniu:

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

Po prostu wyłączasz zdarzenia po kompilacji na serwerze kompilacji za pomocą

msbuild foo.sln /p:PostBuildEvent=

Nie jest to wystarczające, jeśli masz inne zdarzenia po kompilacji, które również muszą działać na serwerze kompilacji, i nie jest to ogólne rozwiązanie. Jednak ponieważ istnieje tak wiele różnych przyczyn tego problemu, nie może być ogólnego rozwiązania. Jedna z wielu odpowiedzi na to pytanie (i jego duplikatów) prawdopodobnie pomoże, ale bądź ostrożny w przypadku podejść, które tylko w jakiś sposób omijają obsługę błędów (takich jak xcopy /C). Mogą one działać dla Ciebie, szczególnie w scenariuszu z serwerem kompilacji, ale myślę, że ten jest bardziej niezawodny, JEŚLI można go użyć.

Zasugerowano również, że w nowszych wersjach programu Visual Studio problem już nie istnieje, więc jeśli używasz starej wersji, rozważ zaktualizowanie narzędzi do kompilacji.

Florian Winter
źródło
0

Kod błędu 4 może oznaczać wiele rzeczy, więc polecam przeczytanie również innych odpowiedzi, dopóki nie znajdziesz rozwiązania, które działa dla Ciebie ORAZ nie zrozumiesz, DLACZEGO to działa (niektóre rozwiązania wyłączają tylko obsługę błędów, co może tylko maskować problem, ale nie rozwiązać).

Może to być problem z blokowaniem plików związany z budowaniem równoległym. Sposób obejścia problemu: nie używaj budowania równoległego. Jest to zachowanie domyślne, ale jeśli używasz tej -mopcji, projekty będą budowane równolegle. Poniższe odmiany nie powinny budować projektów równolegle, więc nie napotkasz problemu z blokowaniem plików.

msbuild -m:1
msbuild -maxcpucount:1
msbuild

Zwróć uwagę, że w przeciwieństwie do tego, co zostało tutaj powiedziane, dzieje się tak nawet w przypadku „najnowszej” wersji programu MSBuild (z Build Tools for Visual Studio 2019).

Prawdopodobnie najlepszym rozwiązaniem jest upewnienie się, że nie musisz kopiować plików na etapie po kompilacji. W niektórych sytuacjach można również wyłączyć kroki po kompilacji podczas kompilowania za pomocą programu MSBuild na serwerze kompilacji: https://stackoverflow.com/a/55899347/2279059

Florian Winter
źródło