バッチファイルでテキストファイルに文字列処理
概要
Windowsのバッチファイルでファイル内の文字列処理を行う際のTIPSをまとめました。
最初にサンプルを記載し、その後に各機能やTIPSを、サンプルから引用する形でまとめます。
サンプル
実行できることは確認済みです。
@echo off
set string1=hogehoge
set string2=hoge
set string3=fuga
set inputFile="file.txt"
set outputFile="out.txt"
set flag=0
call set replaced_line=%%string1:%string2%=%string3%%%
echo %replaced_line%
setlocal enableDelayedExpansion
(for /f "usebackq delims=" %%a in (%inputFile%) do (
set "line=%%a"
echo !line!
call set replaced_line=!!line:%string2%=%string3%!!
echo "!line!" | find "%string2%" >nul
if not ERRORLEVEL 1 (
call :func1 !line!
echo %flag%
) else (
echo none
)
)) > %outputFile%
endlocal
goto end
:func1
echo %1
set flag=1
exit /b 0
:END
exit /b
if文
if not ERRORLEVEL 1 (
echo %flag%
call :func1 !line!
echo %flag%
) else (
echo none
)
単純に()で区切る。()内に命令が1つもないとエラーになる。
文字列の比較は ==でつなぐ。
エラーレベルのときは例のように書く。
ファイルの存在を確認するときはexistなど。詳しくは if /? で。
ファイルからテキストを読み込んで処理
for /f "usebackq delims=" %%a in (%inputFile%) do (
...
)
for文のオプション/fがファイルからの読み込み指定。
"delims="の後には区切り文字を指定する。例では何も指定していないので改行で区切る。
usebackqを指定すると、入力にコマンド(``で指定)や、""で区切ったファイル名を指定できるようになる。
for文の環境変数遅延展開
setlocal enableDelayedExpansion
(for /f "usebackq delims=" %%a in (%inputFile%) do (
set "line=%%a"
echo !line!
...
)) > %outputFile%
endlocal
バッチファイルは一命令ずつ読み込んで処理する。for文はすべてを読み込んで処理する。読み込みの際に変数が解決される。
例のようにファイルから読み込むなどで環境変数が変わるときは、使用時に!!で囲む指定を行う。
区間内のechoをファイルに出力する
(
...
) > %outputFile%
文字列の置換
set replaced_line=%string1:hoge=fuga%
通常の固定文字列の指定
call set replaced_line=%%string1:%string2%=%string3%%%
置換前、置換後の文字列に変数を使用する際の指定
callを呼ぶことで、いったん変数が展開されたものが呼び出されるイメージで処理される。
call set replaced_line=!!line:%string2%=%string3%!!
遅延環境変数を使用する際の指定
文字列中の文字列検索
echo "!line!" | find "%string2%" >nul
if not ERRORLEVEL 1 (
call :func1 !line!
) else (
)
例のようにパイプでfindに渡し、結果はnulに捨てる。
エラーコードで結果を判別し処理。
関数呼び出し
set flag=0
...
echo %flag%
call :func1 !line!
echo %flag%
...
:func1
echo %1
set flag=1
exit /b 0
関数呼び出し(サブルーチン)はラベルをcallする。引数を与えられる。
サブルーチン内では引数を%1 %2...で受取可能。(元のbatファイルの引数が上書きされる模様)
サブルーチンの脱出は exit /b で、整数であれば返り値を指定できる。文字列なら環境変数を使うことになる。
forループからサブルーチンに飛ぶと、遅延展開を考慮せずとも良いとされている。
setの違い
set "line=%%a"
setでの文字列の代入は、左辺のみ""でくくると、代入された変数にも""がつく。
左辺と右辺を両方とも""でくくると、代入後の変数に""が入らない。
echoで"ECHOは<OFF>です"などとでる
コマンドプロンプトで呼んでみるとわかるが、echoは引数がないと現状のecho設定を返す。
バッチファイル上で引数を変数として指定されている場合、引数に何も入っていない場合に上記が出力される。
記号が入っているファイルの処理
バッチファイルでは%!=:などが文字列処理の際に使用されるため、入力文字列にそういった記号が含まれている場合に意図しない動作が発生する恐れがある。
バッチファイルでそういった記号が入ったテキストファイルを編集するのはお勧めしない。