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?
źródło
Chociaż
/C
moż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
/R
opcję 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.źródło
start
i na/R
wszelki wypadek ... nie jestem pewien, który z nich załatwił sprawę, ale zadziałał! Dzięki!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:
i ma całkowitą rację.
źródło
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 xcopy
nie 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.
źródło
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.
źródło
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.
źródło
Uruchom VS w trybie administratora i powinno działać dobrze.
źródło
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
.źródło
Może się to zdarzyć w wielu przypadkach:
źródło
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.
źródło
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!
źródło
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.
źródło
Miałem ten sam problem. Proste „czyste rozwiązanie” w VS usunęło błąd, ale było to rozwiązanie tymczasowe.
źródło
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ąć.
źródło
Miałem ten sam problem. Jednak nic mi nie pomogło. Rozwiązałem problem, dodając
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!
źródło
Jeśli używasz systemu Windows 7 w nowszych wersjach, możesz wypróbować nowe polecenie „robocopy”:
Więcej informacji o robocopy można znaleźć tutaj .
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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
iisreset
załatwił mi sprawę.źródło
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.
źródło
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óbxcopy /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 found
błąd (odpowiadający kodowi zakończenia 4).Nie mogłem tego rozgryźć, dopóki nie napisałem
cd
w wydarzeniach związanych z post-kompilacją, aby wydrukować, w którym katalogu jest to wykonywane.Podsumowując, jeśli chcemy
copy
/xcopy
pliki 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.źródło
Może to być spowodowane stacją roboczą VMWare z udostępnionymi folderami
Mam problem zawsze, gdy folder docelowy
xcopy
jest 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.
źródło
Aby rozwinąć odpowiedź Rhughes,
Robocopy działa pięknie, po prostu na wypadek, gdybyś musiał uwzględnić podkatalogi, których możesz użyć
/e
do włączenia subskrypcji i skopiowania pustych katalogów lub/s
do 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:
źródło
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
xcopy
tylko 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ą
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.
źródło
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
-m
opcji, 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.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
źródło