環境変数に改行文字をセット

^ による行の継続を試している時に、環境変数に改行を含んだ文字列をセットできることに気づいた。

set AA=123^

456

のように間に空行をはさむと、AA に 123 改行 456 がセットされる。

set AAA=123^

456^

789

のようにすれば何行でも入る。ただし、この値を表示させようとして、echo %AA% では駄目である。1行目の 123 しか表示されないし、その後に何を書いても無視される。

echo %AA% xyz & date/t   ⇒   123 だけが表示

表示させるためには、遅延展開を有効にして、

echo !AA! xyz & date/t   ⇒   123 改行 456 XYZ 改行 日付 が表示

部分文字列も同様に、%による展開だと改行で途切れるが、改行を飛び越えればOK。

echo %AA:~1%     ⇒   23 が表示
echo %AA:~4%     ⇒   456 が表示(改行はCR+LFの2文字でなく1文字のようだ)
echo !AA:~1!     ⇒   23 改行 456 が表示

次に、命令文としての実行はどうか?

set X=echo 1^

echo 2

として、

%X% xyz & date/t   ⇒   1 のみが表示(2行目やxyzやdate/tは無視)
!X! xyz & date/t   ⇒   1 改行 echo 2 xyz 改行 日付 が表示(echo 2は命令でなく最初のechoのパラメータになっている)

つづく