ksaitoの日記

日々試したことの覚え書き

バッチファイルでファイルの一部を文字列置換する方法

かなり前に、バッチファイルで実行結果を環境変数に格納する方法を書きました。
今回は、その方法を一部応用して設定ファイルの一部を書き換える方法を考えました。
zabbix-agentdの設定ファイルのように一部をhostnameコマンドの結果で置き換えるような用途に使えます。

サンプル

Windowsにもhostnameコマンドがあります。

C:\temp>hostname
win10
 
C:\temp>

repl.batは、前半でhostnameコマンドの結果をHNAME環境変数に設定します。
後半で第一引数に指定したファイルを読み込んで第二引数に指定した文字列をHNAME環境変数で置き換えます。

C:\temp>type repl.bat
@echo off
 
setlocal enabledelayedexpansion
for /f "usebackq tokens=*" %%i in (`hostname`) do @set HNAME=%%i
 
for /f "delims=" %%A in (%1) do (
  set line=%%A
  echo !line:%2=%HNAME%!
)
endlocal
C:\temp>

実行

百聞は一見にしかず、実行してみます。
repl.batのlineをhostnameコマンドの結果で置換します。

C:\temp>repl.bat repl.bat line
@echo off
setlocal enabledelayedexpansion
for /f "usebackq tokens=*" %%i in (`hostname`) do @set HNAME=%%i
for /f "delims=" %%A in (%1) do (
  set win10=%%A
  echo   set win10=%%A
)
endlocal
C:\temp>

難点は、空行は無視されます。
上記の結果のように環境変数の置換があるとエスケープしてくれないようです。
このあたりは、割り切りでしょう。
なかなか、応用範囲が広くなりました。