Chapter 01

(重要)安全なバッチファイルを書くために

zetamatta
zetamatta
2020.11.17に更新

これが一つのテンプレートになります。

@ECHO OFF
SETLOCAL
SET "VAR=%~1"
REM
REM *** 処理本体 ***
REM
ENDLOCAL
EXIT /b

機能文字があっても安全に環境変数に代入する

SET文を使うとき、いくつか定番的な書き方があります。

  • 環境変数名とイコール、右辺まで含めて、全部を二重引用符で囲む
    • リダイレクト用文字(>,<)やコマンドセパレータ(&)などの機能文字が %1 の中に含まれていても、機能しなくなる
    • 二重引用符自体が VAR の中に含まれなくなる
  • 引数は %1 ではなく %~1 とチルダを一つつける
    • チルダをつけると %1 の中に含まれる二重引用符を外してくれる
    • %1 の中に二重引用符が含まれていない場合は何も変わらない
  • バッチファイルの中で変更された環境変数は呼び出し元の CMD.EXE にも反映されてしまう
    • それをさけるには変更されるブロックの前後を SETLOCAL ~ ENDLOCAL で囲む

詳しい仕様は SET /? で確認できます。

終了処理

EXIT文でバッチを終了する時は/bオプションをつけます。/b をつけないとバッチ処理が呼び出し元の CMD.EXE を巻き込んで終了してしまいます。また、exit /bcall :ラベル 呼び出されるサブルーチンの中では return処理として機能することを留意しておいてください。

エコーバックの停止

通常はバッチファイルの各コマンドが画面にも表示されます。これを抑制する時は @ECHO OFF を先頭に入れます。ECHO OFF でもよいのですが、そうすると ECHO OFF そのものが表示されてしまいます。@ を先頭に入れると、その行だけピンポントで表示も抑制できます。

ただし、バッチファイルの性質上、コマンドはいちいち表示された方が動作を確認できてよいので、邪魔な行だけ先頭に @ をつけてエコーバックを抑制するのも一つの方法です。