バッチファイルでのメッセージ出力

バッチファイルでのメッセージ出力についてのメモ書きです。*1
(参考:シェルスクリプトでのメッセージ出力)

コマンドエコーをOFFにする
  • 「echo off」を実行すると、コマンドエコーがOFFになる。(「echo on」でONに戻る。)
  • 一時的にコマンドエコーをOFFにする場合は、コマンドの前に「@」を付ける。
  • バッチファイルの先頭では、「@echo off」とすることが多い。
@echo off
...
echoコマンド
  • メッセージ出力には、通常はechoコマンドを使う。
  • echoコマンドの出力先は、標準出力となる。
  • echoコマンドでメッセージを出力すると、必ず改行される。
  • 空行を出力する場合は、「echo.」とする。*2
  • 「%」を出力する場合は、「%%」でエスケープする。
  • その他の特殊文字(「>」や「^」など)を出力する場合は、その文字の前に「^」を付けてエスケープする。
@echo off

rem 通常
echo メッセージ

rem 空行
echo.

rem %のエスケープ
echo %%OS%%: %OS%

rem 特殊文字のエスケープ (<と>)
echo ^<a href="http://www.hatena.ne.jp/"^>はてな^</a^>
一時停止
  • 一時停止には、pauseコマンドを使用する。
  • pauseコマンドのメッセージを変える場合は、echoコマンドとNULへのリダイレクトを組み合わせる。
@echo off

rem 通常
pause

rem メッセージ変更
echo 何かキーを押すと終了します...
pause > NUL
ユーザ入力
  • 「set /p」を使うことにより、ユーザが入力した文字列を環境変数にセットできる。
  • 「set /p」では、ユーザに表示するメッセージを指定できる。(メッセージなしも可能)
  • 一般的には、入力文字列内の特殊文字をチェックする必要がある。
  • 「set /p」とNULからのリダイレクトを組み合わせると、改行なしのメッセージ出力を実現できる。
@echo off

rem ユーザ入力
set /p YN="Yes or No? (y/n): "

rem 二重引用符を取り除く
if defined YN (
    set YN=%YN:"=%
)

rem 改行なしのメッセージ出力
set /p DUMMY="答え: " < NUL

rem 入力値の判定
if /i "%YN%" == "y" (
    echo Yes
) else (
    echo No
)
標準エラー出力
  • 標準エラー出力にメッセージを出力する場合は、echoコマンドなどとリダイレクトを組み合わせる。
  • コマンドを括弧で囲むことにより、複数コマンドの出力をまとめてリダイレクトできる。*3
@echo off

rem 標準エラー出力 (echo)
echo メッセージ1 1>&2

rem 標準エラー出力 (set /p)
set /p DUMMY="メッセージ2" < NUL 1>&2
echo. 1>&2

rem 標準エラー出力 (複数行)
(
    echo メッセージ3
    echo メッセージ4
    echo メッセージ5
) 1>&2

*1:Windows XP SP3で確認しました。

*2:「.」以外に、「:」や「;」などの記号も使えます。

*3:「)」と「1>&2」の間では改行できないようです。