2011-06-27 13 views
6

Właśnie zaczynam się uczyć skryptowania. Próbuję zrozumieć, w jaki sposób system radzi sobie z poziomami błędów i jak można ich używać w obsłudze błędów. Wiem, że istnieje różnica między zmienną środowiskową% ERRORLEVEL% a poziomem błędu systemu. Jeśli rozumiem to poprawnie, kod If ERRORLEVEL 1 będzie sprawdzał zmienną środowiskową, zanim sprawdzi poziom błędu poprzedniego polecenia.Programowanie wsadowe, obsługa błędów i polecenie uruchamiania

Tak, w moim programie próbuję połączyć skrypt uruchamiania/zatrzymania, który uruchomi/zatrzyma wszystkie skrypty danego komputera (do testowania używam tylko jednego programu notepad.exe jako przykładu). Mam dwa skrypty opakowujące, które uruchamiają lub zatrzymują aplikacje, przekazując argumenty do niezależnego skryptu. Jeśli wystąpi błąd w niezależnym skrypcie, ustawi on poziom błędu przy użyciu polecenia. Gdy kontrola zostanie zwrócona do skryptu wywołującego, przejdzie ona do skryptu obsługi błędów, jeśli status wyjścia jest niezerowy.

Najpierw ustawiałem% ERRORLEVEL% na zero ręcznie, a następnie testowałem błąd po poleceniu START lub TASKKILL. Ale potem przeczytałem, że wyczyszczenie% ERRORLEVEL% z SET ERRORLEVEL= jest lepszym sposobem. Mój problem przychodzi, gdy próbuję uruchomić aplikację z

START "" notepad.exe 

Ilekroć przetestować errorlevel po tej komendy to jest zawsze większa lub równa 1, chyba że używam SET ERRORLEVEL = 0, zanim uruchomić komendę startu. Wstawiłem kod dla czterech skryptów poniżej. Wszelkie dociekania i porady będą mile widziane.

appstart.bat:

@echo off 
:: Script for application Start 
set ERRORLEVEL= 
:: **** 
:: Additional Batch files will be executed from within this file 
:: Example: 
::  Call Appbat01.bat 
:: The called batch file should set ERRORLEVEL non-zero if error 
:: **** 

call test.bat -start 
if ERRORLEVEL 1 (call error.bat) 
echo. 
echo Control was returned to appstart.bat... 
:: **** End Calls 
goto end 

:end 

appstop.bat:

@echo off 
:: Script for application Start 
set ERRORLEVEL= 
:: **** 
:: Additional Batch files will be executed from within this file 
:: Example: 
::  Call Appbat01.ba 
:: The called batch file should set ERRORLEVEL non-zero if error 
:: **** 

call test.bat -stop 
if ERRORLEVEL 1 (call error.bat) 
echo. 
echo Control was returned to appstop.bat... 
:: **** End Calls 
goto end 

:end 

TEST.BAT:

@echo off 
if "%1"=="-start" goto :start 
if "%1"=="-stop" goto :stop 
goto wrongParams 

:start 
::**** 
:: Insert start up stripts here... 
:: If there is an error, set ERRORLEVEL=1 
::**** 
    set ERRORLEVEL=0 
    echo. 
    echo ******** 
    echo starting the service... 
    echo. 
    ::start "" "C:\Program Files\Microsoft Office\office11\winword.exe" 
    start notepad.exe 
    if ERRORLEVEL 1 goto error 
    qprocess notepad.exe 
    echo *Start.success* ERRORLEVEL is: %ERRORLEVEL% 
    echo. 
    goto end 

:stop 
::**** 
:: Insert stopping stripts here... 
:: If there is an error, set ERRORLEVEL>1 
::**** 
    set ERRORLEVEL=0 
    echo. 
    echo ******** 
    echo stopping the service... 
    echo. 
    qprocess notepad.exe 
    taskkill /f /im notepad.exe 
    if ERRORLEVEL 1 goto noProcess 
    goto end 

:noProcess 
    set ERRORLEVEL=2 
    echo *noProcess* ERRORLEVEL is now: %ERRORLEVEL% 
    echo. 
    exit /b 2 
:error 
:: Errorhandler. Log application status and cause of error here. Set 
:: ERRORLEVEL > 1 before returning to caller. 
    set ERRORLEVEL=1 
    echo. 
    echo **** Error handler inside test.bat **** 
    echo. 
    echo *error* ERRORLEVEL is now: %ERRORLEVEL% 
    echo. 
    exit /b 1 

:wrongParams 
:: Output an error if the wrong parameters were passed to this script. 
:: Maybe try to self correct the parameter... 
    set ERRORLEVEL=1 
    echo. 
    echo '%1' is an invalid parameter. 
    echo Usage: %0 [-stop ^| -start] 
    echo *wrongParams* ERRORLEVEL is now: %ERRORLEVEL% 
    echo. 
    exit /b 1 
:end 

error.bat:

@echo off 
echo **** You have reached error.bat **** 
echo ERRORLEVEL inside of error.bat is: %ERRORLEVEL% 
echo. 
::*** Handle error...*** 
goto error%ERRORLEVEL% 

:error2 
    echo The process could not be stopped for some reason. 
    goto end 
:error1 
    echo The process had an error in start up. 
::***    *** 
    goto end 

:end 
+0

Jeśli używasz kodu, w tym miejscu pojawia się błąd. Jeśli używam startu, odpalam notatnik bez żadnych błędów. Jeśli używam stopu, zatrzymuje on notatnik bez żadnych błędów. Jeśli użyję ponownie stop, spowoduje to błąd zgodnie z oczekiwaniami. Teraz, jeśli używam startu, powinien on ponownie uruchomić notatnik bez żadnych błędów. Jednak instrukcja if po poleceniu START jest prawdziwa i przechodzi do błędu. Nie jestem pewien, dlaczego tak się dzieje. Proszę pomóż! – grocky

Odpowiedz

12

Nie powinieneś nigdy ustawiać zmiennej% errorlevel%. Masz rację, że istnieje różnica; Poziom błędu, jaki uzyskujesz z procesu wychodzącego, jest wewnętrznym rejestrem, który możesz odczytać za pomocą składni% errorlevel%. Jeśli jednak utworzysz zmienną o nazwie ERRORLEVEL, będzie ona maskować wewnętrzny rejestr i utracisz dostęp do kodów wyjścia.

Jeśli trzeba ustawić rejestr errorlevel do określonej wartości, można to zrobić za pomocą następującego polecenia:

%comspec% /c exit %value% 

To będzie tarło proces, który natychmiast kończy pracę z żądanego kodu.

+0

Fantastyczne! Udało mi się uruchomić skrypty bez żadnych nieoczekiwanych błędów.Próbowałem nie ustawiać ERRORLEVEL bezpośrednio przed, ale nie mogłem go skasować przed uruchomieniem następnego polecenia. Ale teraz ustawię ERRORLEVEL ponownie na zero, używając polecenia, które dałeś w skrypcie error.bat po zakończeniu obsługi błędów. – grocky