バッチファイルはテキスト処理が得意ですが、構造化データである JSON や XML を直接扱うのは苦手です。
それでも環境によっては追加ツールを入れられない場合もあります。
本記事では、findstr
を利用した簡易的な検索と、PowerShell を併用して正しく解析する実践的な方法を紹介します。
方法1:findstrで単純な検索を行う
JSON や XML がシンプルな場合は、キーワード検索で目的の行を抜き出せます。
@echo off
rem --- JSON 内から "version" 行を抽出 ---
findstr "\"version\"" config.json
rem --- XML 内から を含む行を抽出 ---
findstr "<title>" config.xml
ただし改行やインデント、属性の有無などで結果が安定しないため、複雑な解析には向きません。
方法2:PowerShellでJSONを解析する
PowerShell の ConvertFrom-Json
を使えば、正確に JSON を読み込んで値を取得できます。
@echo off
setlocal enabledelayedexpansion
for /f "usebackq delims=" %%A in (`
powershell -NoProfile -Command ^
"(Get-Content config.json | ConvertFrom-Json).version"
`) do set "VERSION=%%A"
echo バージョン番号: %VERSION%
endlocal
ネストされたオブジェクトにもドット表記でアクセスできます。
powershell -Command ^
"(Get-Content config.json | ConvertFrom-Json).app.settings.theme"
方法3:PowerShellでXMLを解析する
XML は PowerShell の [xml] 型にキャストすることで、DOM としてアクセスできます。
@echo off
for /f "usebackq delims=" %%A in (`
powershell -NoProfile -Command ^
"([xml](Get-Content config.xml)).configuration.appSettings.add[0].value"
`) do set "VALUE=%%A"
echo XMLの値: %VALUE%
XPath に近いアクセスが可能で、属性値も簡単に取得できます。
方法4:値を変数に格納して処理に使う
抽出した値を環境変数に入れて後続処理に利用できます。例えばバージョン番号を出力フォルダ名に使うケースです。
@echo off
setlocal
for /f "usebackq delims=" %%A in (`
powershell -NoProfile -Command ^
"(Get-Content config.json | ConvertFrom-Json).version"
`) do set "VER=%%A"
mkdir "build\%VER%"
echo 出力先: build\%VER%
endlocal
まとめ
バッチだけで JSON や XML を完全に処理するのは困難ですが、以下の工夫で対応可能です。
- シンプルな用途なら
findstr
で行抽出 - 確実な解析が必要なら PowerShell の
ConvertFrom-Json
や [xml] 型を併用 - for /f で値を環境変数に格納し、バッチ内の処理に活用
JSON/XML を扱う場面では、バッチの補助として PowerShell を呼び出すのが最も堅実で効率的なアプローチです。