お便りに答えて

昨日の記事について、
ファンさんからまたコメント*1をいただいた。いつも何か得るところがある。ありがとうございます。

for 文からの途中脱出は、遅延展開を有効にしておいて、サブルーチンからの戻りを判定して goto すれば可能ですよね。

遅延展開を使うなら、サブルーチンの必要も無くて for 文の中で行数を数えればいいんですが。

その場合に "! が含まれるとダメ" というのは、"空行がスキップされる" と同様のレベルであきらめるしかないのでは。

今ちょっと考えてるのが駄目だったらそうですね。まあ、その時は、バッチスクリプトで head コマンドが書けなかったと言うことです。

記号は ^ でエスケープができる。ただし参照するごとに失われるので、その回数を考慮し、^ 自身をエスケープする多段エスケープが必要。ここで問題は ^ 自身が最初から含まれる場合。これはエスケープのしようがない。

によるエスケープは知りませんでした。環境変数の内容をあらかじめ置換しておくということだと思いますが、ちょっと大変ですね。ただ、エスケープ機能自体は知っておけば今後何かの場面で使えそうです。遅延展開時の !環境変数へのセットにも効きました。

setlocal enabledelayedexpansion
set A=^^^!       % ^ が3個 (これは考えてやったらうまくいった)%
echo !A!
set A=^^^^^^^^^^!  % ^ が10個 (これは考えたら7個かなと思ったら駄目だった。順に個数を増やしていって10個でうまくいった)% 
echo %A%

gawk "NR <= %MAX%" "%FILE%" で簡単に実現できることを、制約の多い(こういうことの得意でない) CMD.exe でがんばって(しかも headコマンドのような単純なものを)やろうとすることに意義があるのか個人的には疑問です(実は自分で昔いろいろチャレンジしたことがあるのでそう思うのかもしれませんが)。

それを言っちゃあおしまいと言うか、CMD.exe でどこまで出来るかを探るのも目的のひとつなんで。
別に、head コマンドが必要だから作ってるわけじゃありませんから。

*1:オリジナルサイトでのコメントの話なのでこのサイトではコメントは付いてない