バッチファイル | テキストファイルを 1 行ずつ読み込む (完全版?)
バッチファイル | テキストファイルを 1 行ずつ読み込む (完全版?)
test0
test1 test1; test3
test4 & cls
test5 > con
test 6
1.スペースで文字列が切れる
@echo off
for /f %%X in (test.txt) do (
echo %%X
)
test0
test1
test4
test5
test
これを修正するには、 "delims=" で区切り文字列をなくすよう指定します。
2.";" (セミコロン) で始まる行がスキップされる
@echo off
for /f "delims=" %%X in (test.txt) do (
echo %%X
)
実行結果
test0
test1 test1
test4 & cls
test5 > con
test 6
これを修正するには、 "eol=" でコメント文字列をなくすよう指定します。
3.空行 (空白行) がスキップされる
@echo off
for /f "delims= eol=" %%X in (test.txt) do (
echo %%X
)
実行結果
test0
test1 test1
; test3
test4 & cls
test5 > con
test 6
これを修正するには、 findstr コマンド等で行番号を付加し、"tokens=1* delims=:" で行番号を分離します。
"tokens=1*" を指定することで、文字列中に ":" (コロン) が含まれていても正しく処理されます。
4.空白行を echo で表示できない
@echo off
for /f "tokens=1* delims=: eol=" %%X in ('findstr /n "^" test.txt') do (
echo %%Y
)
test0
test1 test1
ECHO は <OFF> です。
; test3
test4 & cls
test5 > con
test 6
これを修正するには、 echo の直後に "." (ピリオド) を打ちます。 (echo と "." (ピリオド) の間にスペースを入れてはならない)
5.完成 ※修正前版
@echo off
for /f "tokens=1* delims=: eol=" %%X in ('findstr /n "^" test.txt') do (
echo.%%Y
)
実行結果
test0
test1 test1; test3
test4 & cls
test5 > con
test 6
5+.行頭のコロンが消える ※修正後版
@echo off
for /f "tokens=* delims=0123456789 eol=" %%X in ('findstr /n "^" test.txt') do (
set Y=%%X
setlocal enabledelayedexpansion
echo.!Y:~1!
endlocal
)
また、文字列を for 中で処理するために遅延環境変数を有効にしていますが、set Y=%%X の時点で有効になっていると、テキスト中に「%PATH%」などの文字列があった時に環境変数の中身が展開されてしまうので注意です!
6.おまけ: echo は かっこ で囲うといいかもしれない
(echo.文字列) >> 出力先
対象のファイル(test.txt)の中に「!」 エスクスクラメーション が存在していても 正しい動作になりますか? 教えて下さい。そのような内容が書かれたサイトを見たことが無いので。よろしくお願いします。
> koiさん
自分が確認した限りでは大丈夫そうです。
test.txt 中、先頭に「:」(半角コロン)が入っている時、
これも表示したいのですが、表示されませんでした。
色々トライしているのですが、うまくいかず、
良いアイデアございますか。
恐れ入ります。
「!」はすべて取り除かれてしまいました。
> itcさん
確認しました。行頭以外のコロンはテスト済みだったのですが、行頭のみダメとは…。
これは、for の tokens, delims を使っている限り対処が難しそうですね…。
for とは別に文字列操作が必要そうです。後で考えてみます。
> hyesrさん
すいません、こちらでは「!」が取り除かれる現象は確認できませんでした…。
前後の文字列などに依存して発生する問題かもしれないので、問題が起こる文字列を教えていただけますでしょうか?
> itcさん
行頭コロン対応しました。
WIndows のコマンドって文字列操作が最低限しかできないので大変でした… (汗
for で行頭にある行番号を消した後で、コロン一文字だけを消すようにしてみました。
文中の!!が入ったところから:までが削除されちゃいました
!!を回避する方法模索中です
念のためご報告まで