【続々】標準入力からの読み取り

8/5記事においていったんギブアップした標準入力の読み取りではあるが、ちょっと思いついたので、WHICHコマンドの連載を中断してこっちを書く。

set /pによる標準入力読み取りにおいて空行とEndOfFileが区別できないのは確かである。しかし、空行には次にいずれ空行で無い行がつづく(可能性が高い)のに対して、EndOfFileはそれ以降ずっとEndOfFileであるという違いがある。

そこで、ファイル中に100行以上の空行が続くことは無いという前提を置くと、次のようなスクリプトが書ける。100でまずければもっと増やせばいい。

@echo off
setlocal enabledelayedexpansion
set N=0
:loop
set X=
set /p X=
if not defined X (
 if %N% == 100 goto :eof
 set /a N=N+1
 goto loop
)
for /l %%I in (1,1,%N%) do echo.
set N=0
echo !X!
goto loop

注意だが、:loopの次とその次のX=のイコールの後はすぐ改行。また、後ろから4行目のecho.は、空行出力の定石である。後ろから2行目の!X!については7/27記事:【続】変数中のリダイレクト文字を参照。

残念ながら、ファイル末尾の空行は削除されてしまうがこれは致し方ない。通常は困ることはないであろう。
これで借りは返したぞ。