head コマンドが作れるか? (3)
昨日書いたように、途中で for を終了させるのは出来なさそうなので、ループをファイルの行数回だけまわるのは止むを得ないとすると、一定回数以上まわったら echo をスキップするようなことを考える。
rem スクリプト5: setlocal set N=0 for /f "delims=" %%A in (x) do ( call :sub %%A ) goto :eof :sub set /a N=N+1 if %N% lss 20 echo %*
ファイル中に変な文字が無ければこれで期待通りの動きはする。しかし、ファイル中の文字によっては、
(1) /? という文字列があると、call のヘルプが表示される
(2) & | 等の文字があるとその行は表示されない(サブルーチンが実行されない)
(3) < > 等の文字があるとそれ以降右の文字が表示されない(サブルーチンに渡らない)
などという不具合が生じる。(1) はわからないでもないが、(2) (3) については別途もう少し調べてみたい。
サブルーチンコールの際に引数を " " で囲えば呼ぶ段階では安全であり上記のような問題は生じない。
rem スクリプト6: setlocal set N=0 for /f "delims=" %%A in (x) do ( call :sub "%%A" ) goto :eof :sub set /a N=N+1 if %N% lss 20 echo %~1
しかし、8/28:変数置換の順序で書いた通り、引数の置換は早くに行なわれるため、< > & | 等の文字列が含まれると echo の段階でおかしくなるため、どのみちこれも駄目である。
つづく