Czy można poprosić ROBOCOPY o wyjście z kodem wyjścia wskazującym powodzenie lub niepowodzenie?
Korzystam z ROBOCOPY jako części konfiguracji kompilacji TeamCity, a konieczność dodania kroku wyciszenia kodu wyjścia z ROBOCOPY wydaje mi się głupia.
Zasadniczo dodałem to:
EXIT /B 0
do uruchamianego skryptu.
Jednak to oczywiście maskuje wszelkie rzeczywiste problemy, które powróci ROBOCOPY.
Zasadniczo chciałbym mieć kody wyjścia 0 dla SUKCESU i niezerowe dla BŁĘDU zamiast maski bitowej, którą ROBOCOPY zwraca teraz.
Lub, jeśli nie mogę tego mieć, czy istnieje prosta sekwencja poleceń wsadowych, która przekształciłaby maskę bitową ROBOCOPY na podobną wartość?
Odpowiedzi:
Zgodnie z tym , Robocopy ma następujące bity kodu wyjścia, które składają się na kod wyjścia:
Wystarczy dodać instrukcje if / else, że
EXIT /B 0
gdy zwracana wartość wynosi 1 lub może 0, i wEXIT /B 1
przeciwnym razie. Nawet jeśli pliki mogły zostać skopiowane, istnieje coś złego, co wymagałoby ręcznej interwencji.źródło
TechNet sugeruje, aby ten linijka przekształciła kod wyjścia w bardziej tradycyjny kod wyjścia:
Lub to całkowicie zignorować kod wyjścia (tj. Nie przejmuj się, czy nie powiódł się lub powiódł):
Jednak obie powyższe komendy zakończą skrypt po wykonaniu robocopy. Jest to problem szczególnie w przypadku kompilacji CI. Jeśli chcesz użyć robocopy w tym scenariuszu, musisz ręcznie ustawić kod błędu dla nieistotnych kodów wyjścia. Poniżej wszystkie kody błędów poniżej 8 zostaną przepisane bezbłędnie, a skrypt będzie kontynuowany, jeśli to możliwe.
źródło
IF %ERRORLEVEL% LEQ 3 set errorlevel=0
i w następnym wierszu:if %errorlevel% neq 0 exit /b %errorlevel%
(jeśli plik wsadowy składa się z kilku operacji, nie tylko robocopy), ponieważ kody OK są mniejsze niż 3. ss64.com/nt/robocopy -exit.htmlERRORLEVEL
z podwójnym %%, na przykład: %% ERRORLEVEL %%. W przeciwnym razie uważa to za parametr kompilacji TeamCity.^&
zrobić? ss64 mówi, że ucieka, ale wydaje mi się, że nie należy tego robić?Uruchomienie go z Jenkins wymaga zarówno
( )
i/B
. Jeśli chcesz zignorować poziom błędu 1,2,3,4:źródło
Na tej stronie możesz dodać sekcję do pliku wsadowego, która używa listy kodów błędów do generowania błędów i uruchamiania różnych sekcji kodu:
źródło
Używam tego:
źródło
W niektórych plakatach powyżej brakuje subtelności maski bitowej. W szczególności paradroid nie zauważył, że poziom błędu 3 wskazuje na całkowicie udaną kopię.
Zauważ, że bit 0x01, jeśli ustawiony, wskazuje, że niektóre pliki zostały skopiowane, nawet jeśli wystąpiły inne awarie. Zatem wszelkie niepoprawne poziomy błędów zawsze wskazują, że przynajmniej niektóre pliki zostały skopiowane. Zauważ również, że bit 0x02 po prostu wskazuje, że w miejscu docelowym znajdują się pliki, których nie ma w źródle. Stanie się tak, jeśli zostanie użyty przełącznik / E, a pliki zostały usunięte ze źródła od momentu pobrania poprzedniej kopii. Nie powinno się to zdarzyć, jeśli używany jest przełącznik / MIR, ponieważ powinien on usuwać pliki w miejscu docelowym, aby wykonać kopię lustrzaną źródła (ale nie przetestowałem tego).
Zatem oba poziomy błędu 1 i 3 wskazują na udane kopiowanie plików bez błędów. Również poziomy błędu 0 i 2 wskazują, że miejsce docelowe jest aktualne i nie skopiowano żadnych plików.
Dla mojej wartości wymyśliłem następujące dla mojej prostej kopii zapasowej:
jeśli poziom błędu 16 echo Tworzenie kopii zapasowej nie powiodło się - patrz powyższy powód i gotowe
jeśli poziom błędu 8 echo Wszystko nie jest dobrze - tworzenie kopii zapasowej niekompletne i gotowe
jeśli poziom błędu 4 echo Wszystko nie jest dobrze - niektóre pliki były niedopasowane i gotowe
jeśli poziom błędu 3 echo Tworzenie kopii zapasowej zakończyło się powodzeniem i gotowe
jeśli błąd poziomu 2 echo Kopia zapasowa jest już aktualna - żadne pliki nie zostały skopiowane i gotowe
jeśli poziom błędu 1 echo Tworzenie kopii zapasowej zakończyło się powodzeniem i gotowe
jeśli poziom błędu 0 echo Tworzenie kopii zapasowej jest już aktualne - żadne pliki nie zostały skopiowane i gotowe
Zdecydowałem się nie przejmować „dodatkowymi” plikami.
Nie mam pojęcia, czym jest błąd „niedopasowany”, ponieważ jeszcze się nie zdarzyło, ale na wszelki wypadek pozwoliłem na to.
źródło
Zgadzam się z gościem Johnem - naprawdę chcesz wskazać błąd tylko wtedy, gdy wynik wynosi w rzeczywistości 8 lub więcej.
więc aby zmapować wynik robocopy na wynik 0 (sukces) lub 1 (błąd), odpowiedni do użycia w zadaniu agenta SQL, używam tego:
źródło
W TeamCity używam tego i działa całkiem dobrze. Dzięki wkładowi MikeWyatt, DaoCacao i Yan Sklyarenko. Musiałem tylko zobaczyć pełny działający przykład, aby pomóc w wizualizacji odpowiedzi.
źródło
dodaj cmd / c przed nim dla gitlab ci.
w przeciwnym razie EXIT 0 zamyka potok CI w tym punkcie.
źródło
Oto przykład, jak skopiować gotowe pliki z Visual Studio 2010+ do innego folderu, ponieważ Visual Studio oczekuje na 0, a nie 1 na dobrej kopii.
źródło