2013-10-03 8 views
7

Jestem całkiem nowy na tym forum, więc najpierw chcę podziękować za dostarczenie mi rozwiązań jeszcze zanim stałem się członkiem :).Nie można uzyskać poziomu błędu od nieudanego polecenia PRZESUŃ w skrypcie wsadowym

Więc mam ten kod:

for %%a in ("%PBpath%") do ( 
move "network location 1 files" "network location 2" >NUL 
if ERRORLEVEL 0 (echo Diagram %%~na.pdf was successfuly archived) else (echo   Diagram %%~na.pdf was not archived) 
ECHO.%errorlevel% 
     ) 

Problem polega na tym, że nie mogę dostać ERRORLEVEL inną niż 0. Nawet gdy pliki, które mają być kopiowane brakuje miejsca, i jeszcze dostać Pomyślnie zarchiwizowana wiadomość powtarza się. Szukałem na forum podobnych pytań, ale nie mogłem z jakiegoś powodu zadziałać. Czy jest coś innego między poleceniem kopiowania i polecenia ping (polecenie ping zwraca poprawny kod zakończenia na poziomie błędu), ponieważ nie mogę go pobrać ani skopiować ani przenieść ...

Dzięki! Andrew

Odpowiedz

7

Najdziwniejsze o rachunku IF ERRORLEVEL jest to, że nie działa tak, jak się spodziewać-zwraca TRUE jeśli errorlevel jest równa lub większy niż liczba określona. Awaria w trybie MOVE ustawia poziom błędu na 1 (właśnie sprawdziłem), który jest większy niż 0. Dlatego zawsze będzie używana pierwsza klauzula instrukcji IF. Najprostszym sposobem, aby naprawić swój skrypt jest odwrócenie warunków w rachunku, jeżeli:

if ERRORLEVEL 1 (echo file was not archived) else (echo file was successfully archived) 
+0

Dziękuję za odpowiedzi. Odpowiedź Superboba rozwiązała mój problem, dziękuję bardzo. W rzeczywistości jest to zachowanie sprzeczne z intuicją. Jednakże, polecenie ECHO.% Errorlevel% w moim przykładzie nadal zwraca 0, więc nie jest ustawione na 1 w moim przypadku. Co do odpowiedzi Endoro, czy możesz być bardziej konkretny? Próbowałem użyć% ERRORLEVEL% == 0, ponieważ żadna inna opcja nie działałaby z poziomem błędu jako zmienną, ale również tutaj nie ma wyniku. – user2844129

+0

Czy są jakieś instrukcje między IF ERRORLEVEL 1 i ECHO.% Errorlevel%? Jeśli tak, mogliby zresetować poziom błędu. Właśnie próbowałem 'if ERRORLEVEL 1 (echo ErrorLevel% ERRORLEVEL%, plik nie został zarchiwizowany) else (echo ErrorLevel% ERRORLEVEL%, plik został zarchiwizowany)' i uzyskał oczekiwany wynik 'ErrorLevel 1, plik nie został zarchiwizowany' – Superbob

+0

Nie, nie chcę Masz coś pomiędzy, ale masz rację, to działa. Problem polegał na tym, że echo '% ERRORLEVEL%' wewnątrz pętli for i miałem włączoną opcję DelayedExpansion. Musiałem użyć! i zadziałało. Dziękuję za pomoc! – user2844129

3

Wystarczy użyć %ERRORLEVEL% zmienną zamiast ERRORLEVEL funkcję

0

Jeśli ktoś chce korzystać z funkcji ERRORLEVEL, Superbob'sanswer adres to (chociaż zamiast tego polecam zamiast tego formularz if NOT ERRORLEVEL 1 (echo file was successfully archived) else (echo file was not archived)).

Ale jeśli chce się użyć metody zmiennej% ERRORLEVEL%, należy włączyć Delayed Expansion. Powyższy kod PO z zalecanymi zmianami znajduje się poniżej:

setlocal enabledelayedexpansion 

for %%a in ("%PBpath%") do (
    move "network location 1 files" "network location 2" >NUL 
    if !ERRORLEVEL! equ 0 (
    echo Diagram %%~na.pdf was successfully archived 
) else (
    echo Diagram %%~na.pdf was not archived) 
) 
Powiązane problemy