2011-06-27 8 views
6

私はどのようにスクリプトに学ぶことを始めています。システムがどのようにエラーレベルを処理し、どのようにエラー処理に使用できるかを理解しようとしています。私は、環境変数%ERRORLEVEL%とシステムのエラーレベルに違いがあることを知っています。私はこれを正しく理解していれば、それは前のコマンドのエラーレベルをチェックする前に、その後、 If ERRORLEVEL 1 コードは、環境変数をチェックします。バッチプログラミング、エラー処理、およびスタートコマンド

だから、私のプログラムの中で、私は(テストのために、私は単なる一例として、一つのアプリケーションのメモ帳を使用しています)指定されたマシンのすべてのスクリプトを停止/起動します起動/停止スクリプトをインタフェースしようとしています。私は独立したスクリプトに引数を渡すことによってアプリケーションを起動または停止する2つのラッパースクリプトを持っています。独立したスクリプトにエラーがある場合は、 EXIT /B n

コマンドを使用してエラーレベルを設定します。制御が呼び出し元のスクリプトに戻されると、終了ステータスがゼロ以外の場合はエラー処理スクリプトに移ります。

最初に私は手動でゼロ、次いでSTARTまたはTASKKILLコマンドの後にエラーをテストするには、%ERRORLEVEL%と設定しました。しかし、その後、私は SET ERRORLEVEL= と%のERRORLEVEL%でクリアすると、より良い方法であることを読みました。私の問題は、私は私がstartコマンドを実行する前に、私はSET ERRORLEVEL = 0を使用しない限り、それは常に1以上である、このコマンドの後にエラーレベルをテストするたびに

START "" notepad.exe 

でアプリを起動しようとしています。以下の4つのスクリプトのコードを挿入しました。どんな洞察とアドバイスも大変ありがとうございます。

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

あなたがコードを実行している場合、私はエラーを取得する場合には、これがあります。私がstartを使用すると、エラーなしでメモ帳を起動できます。 stopを使用すると、エラーなしでメモ帳が停止します。もう一度stopを使用すると、期待どおりにエラーがスローされます。さて、私がstartを使用すると、エラーなしでメモ帳が起動するはずです。ただし、STARTコマンドの後のifステートメントはtrueで、エラーになります。なぜこれが起こっているのか分かりません。助けてください! – grocky

答えて

12

%errorlevel%変数を設定しないでください。あなたは違いがあるということは間違いありません。終了プロセスから得られるエラーレベルは、%errorlevel%構文で読み取ることができる内部レジスタです。ただし、ERRORLEVELという名前の変数を作成すると内部レジスタがマスクされ、終了コードにアクセスできなくなります。あなたが特定の値にエラーレベルレジスタを設定する必要がある場合

、次のコマンドでそれを行うことができます。

%comspec% /c exit %value% 

これは、すぐに目的のコードで終了プロセスを生成します。

+0

素晴らしい!予期せぬエラーがなくてもスクリプトを実行することができました。私は直前にERRORLEVELを設定しようとしませんでしたが、次のコマンドを実行する前にリセットすることができませんでした。しかし、エラー処理の終了後にerror.batスクリプトで指定したコマンドを使用して、ERRORLEVELを0に戻しました。 – grocky

関連する問題