【続】スクリプト中の未定義環境変数の謎
昨日の続きである。
環境変数名に空白が含まれても良いとか、数字でも良いとか書いたが、日本語ももちろんOKのようである。
またいくつかの記号も使える。なんと % も使える。スクリプト中では、% は %% と書くので、以下のようになる。
setlocal enabledelayedexpansion set %%=123 echo !%%!
さて、本題である。昨日の記事で何かピンと来た人はいるだろうか。ヒントは以下の部分である。
5行目であるが、これが難問。%" と "% に囲まれた部分が丸ごと消えてしまう。
" から " までが1つの未定義環境変数名とみなされたのではないか。
これを別の言い方で言うと、「スクリプト中の任意の場所に、%" と "%で囲んだコメントが書ける」ということだ。日本語はもちろんほとんどの記号も書ける。書けない(コメントの終わりとみなされる)のは、% " : の3つくらい。なお、遅延展開を有効にすれば、!" と "!の間にもコメントが書ける。
i%"特に意味は無いがここにも書ける"%f not exist %file% goto :eof
% の展開は構文解析前なのでほんとにどこにでも書ける。しかし、
setlocal enabledelayedexpansion f!"これはだめ"!or %%I in (*) do echo %%I
'for' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
という不思議なエラーメッセージが出る。
! の遅延展開は構文解析後なので、if文やfor文のような構造を持った文の認識を違えさせる場所には書けない。
一方、set文や、echo文の場合は途中に書いても良いようだ。このあたりの違いはいずれ突っ込んでみたい。
さて、ひょんなことから任意の場所にコメントが書ける隠し機能が見つかったわけだ。
問題はこれがどれくらい嬉しいかだ。2000行のツールを書く人には嬉しいかもしれない。他の人だと、rem で十分なのかも。
私?私は実験のネタが見つかって嬉しい。