Why does attempting to echo an undefined environment variable result in the message “ECHO is on”?
https://blogs.msdn.microsoft.com/oldnewthing/20170802-00/?p=96735
バッチファイルから、定義されていない変数の内容を表示しようとしたとする。
set AWESOME=1
echo %AWESUM%
これだと "ECHO は <OFF> です。
" と表示される。どうなっているのだろうか?
この問題の前半は、変数が定義されていない場合、空の文字列に展開されることである。したがって、このコマンドは
echo %AWESUM%
展開後に単にこうなる。
echo
問題の後半は、ECHO
コマンドがコマンドラインなしで実行された場合に echo の現在の状態に応じて、"ECHO は <ON> です。
" または "ECHO は <OFF> です。
" のどちらかが適切に表示されることである。
すべてをまとめると、未定義変数の値を表示しようとする時、echo コマンドは空のコマンドラインを受け取り、その時点での現在の状態を報告する。
では、定義されていないかもしれない変数の値を表示するにはどうすればいいのだろうか?
1 つ目の方法は、コマンドラインに他のものを置くことである。
echo AWESUM=%AWESUM%
AWESUM
が定義されていない場合、こう展開され
echo AWESUM=
"AWESUM=
" と表示される。
オーケー、しかし行の値をすべて実際に表示したいのであれば何をすればいいだろう?
ECHO
コマンドの妙な仕様を利用できる。ECHO
という単語に続けてピリオドを (スペースなしで) 入力すると、ピリオドは表示されないが、ピリオドが存在すると「コマンドラインなし」の動作が抑止され、空白行を得られる。
ECHO.
このコマンドは空白行を表示する。
もし定義されていない可能性のある変数を出力したいなら、こう入力すればいい。
ECHO.%AWESUM%
ECHO
コマンドのこの仕様はもともとコマンドライン パーサーのバグだったが、いったんこれが発見されると、そのバグは機能となった。(バグによる現象が機能に昇格する事はよく ある。お約束の XKCD。)
課題: このバッチファイルによる出力を説明せよ。そして /?
を表示させるにはどう修正すればいいだろうか?
set message=/?
echo %message%