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 の段階でおかしくなるため、どのみちこれも駄目である。

つづく