【bat】外部コマンドの結果を変数に格納する方法(for /f 活用)

バッチファイルで処理を自動化するとき、「外部コマンドの実行結果を変数に格納して後続処理に使いたい」という場面はよくあります。
その際に役立つのが for /f です。標準出力を1行ずつ読み取れるため、値を変数に取り込むことができます。
本記事では、基本的な使い方から応用例まで解説します。

基本:for /f でコマンド結果を1行取得する

for /f`command` 構文を使うと、コマンドの結果を行単位で変数に格納できます。

@echo off
for /f %%A in ('hostname') do set "HOST=%%A"
echo ホスト名は %HOST%

この例では hostname の結果を %%A に受け取り、そのまま HOST 変数に格納しています。

複数行の出力から必要な行を拾う

コマンドによっては複数行の出力があります。必要な1行だけを取り出したい場合は skiptokens を活用します。

@echo off
for /f "tokens=2 delims=:" %%A in ('ipconfig ^| findstr "IPv4"') do set "IP=%%A"
set IP=%IP: =%
echo IPv4アドレスは %IP%

findstr で「IPv4」を含む行を抽出し、tokens=2 delims=: で「:」の右側だけを取得しています。
さらに %IP: =% で余分な空白を削除しています。

コマンドの結果を丸ごと1変数に格納する

出力が1行だけなら、まとめて変数に入れることができます。複数行の場合は最後の行だけが入る点に注意してください。

@echo off
for /f "delims=" %%A in ('ver') do set "VER=%%A"
echo Windows バージョン: %VER%

delims= を指定することで、空白を含む行全体を変数に代入できます。

複数行をすべて扱う(遅延展開を利用)

複数行をすべて変数に格納したい場合は、ループごとに連結していきます。setlocal enabledelayedexpansion を有効にするのがポイントです。

@echo off
setlocal enabledelayedexpansion
set "RESULT="

for /f "delims=" %%A in ('dir /b *.bat') do (
  set "RESULT=!RESULT! %%A"
)

echo バッチファイル一覧: !RESULT!
endlocal

PowerShellと組み合わせる応用

バッチでは処理が難しい文字列操作や日付処理も、for /f と PowerShell を組み合わせれば柔軟に変数に取り込めます。

@echo off
for /f "usebackq delims=" %%A in (`
  powershell -NoProfile -Command "Get-Date -Format yyyyMMdd_HHmmss"
`) do set "NOW=%%A"

echo 現在時刻: %NOW%

まとめ

外部コマンドの結果を変数に格納するには for /f が不可欠です。
ポイントは以下の通りです。

  • 単純な1行 → for /f %%A in ('command') do set VAR=%%A
  • 複数行から特定の部分 → tokensdelims を使う
  • 全体を保持 → delims= と遅延展開を組み合わせる
  • 高度な処理 → PowerShell を呼び出して結果を取り込む

これらを理解しておくと、バッチで外部コマンドをより柔軟に活用できるようになります。