Batch-script-debugging
提供:Dev Guides
バッチスクリプト-デバッグ
多くの場合、バッチファイルの実行時に問題が発生する可能性があり、ほとんどの場合、バッチファイル自体の問題を特定するには、何らかの方法でバッチファイルをデバッグする必要があります。 以下は、バッチスクリプトファイルのデバッグに役立つテクニックの一部です。
エラーメッセージ
メッセージのソースを発見するには、次の手順に従います-
- ステップ1 *-@ ECHO OFFライン、つまり REM@ ECHO OFFまたは::@ ECHO OFF。
- ステップ2 *-必要なコマンドラインパラメータを使用してバッチファイルを実行し、後で比較するためにすべての出力をログファイルにリダイレクトします。
test.bat > batch.log 2>&1
- ステップ3 *-ファイルbatch.logでエラーメッセージを検索します
- ステップ4 *-予期しないまたは無効なコマンド、コマンドラインスイッチ、または値がないか、前の行を確認します。コマンドで使用される環境変数の値に特に注意してください。
- ステップ5 *-エラーを修正し、すべてのエラーメッセージが消えるまでこのプロセスを繰り返します。
複雑なコマンドライン
もう1つの一般的なエラーの原因は、たとえばFOR/Fループ内の誤った検索文字列を含む「ネストされた」FINDまたはFINDSTRコマンドなど、誤ってリダイレクトされたコマンドです。
これらの複雑なコマンドの有効性を確認するには、次の手順に従います-
- ステップ1 *-複雑なコマンドセットを使用する行の直前に「コマンドチェック行」を挿入します。
ECHOコマンドを挿入して、最初のTYPEコマンドの出力が終了し、次のTYPEコマンドの出力が開始する場所を示す例を次に示します。
TYPE %Temp%.\apipaorg.reg
ECHO.================================================ TYPE %Temp%.\apipaorg.reg
| FIND
"[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\"
- ステップ2 *-手順に従って、上記のエラーメッセージソースを見つけます。
- ステップ3 *-「簡略化された」コマンドラインの出力に特に注意してください。出力は期待される形式ですか? 「トークン」の値または位置は予想通りですか?
サブルーチン
エラーメッセージを生成するサブルーチンは、同じバッチファイルで複数回呼び出される可能性があるため、エラーの原因を見つける際に余分な「チャレンジ」を引き起こします。
サブルーチンの不正な呼び出しの原因を見つけるのに役立つように、次の手順に従ってください-
- ステップ1 *-スクリプトの先頭でカウンター変数を追加およびリセットします-
SET Counter = 0
- ステップ2 *-サブルーチンの先頭に次の行を挿入して、サブルーチンが呼び出されるたびにカウンターをインクリメントします
SET/A Counter+=1
- ステップ3 *-カウンタのインクリメントの直後に、SETコマンドのみを含む別の行を挿入します。これにより、すべての環境変数とその値がリストされます。
- ステップ4 *-手順に従って、上記のエラーメッセージソースを見つけます。
Windowsバージョン
同じWindowsバージョンを実行する場合と実行しない場合がある他のコンピューターにバッチファイルを配布する場合は、できるだけ多くのWindowsバージョンでバッチファイルをテストする必要があります。
次の例は、さまざまなオペレーティングシステムのバージョンを確認して、関連するWindowsのバージョンを確認する方法を示しています。
@ECHO OFF
:: Check for Windows NT 4 and later
IF NOT "%OS%"=="Windows_NT" GOTO DontRun
:: Check for Windows NT 4
VER | FIND "Windows NT" >NUL && GOTO DontRun
:: Check for Windows 2000
VER | FIND "Windows 2000" >NUL && GOTO DontRun
:: Place actual code here . . .
:: End of actual code . . .
EXIT
:DontRun
ECHO Sorry, this batch file was written for Windows XP and later versions only