バッチファイルで処理を自動化するとき、「外部コマンドの実行結果を変数に格納して後続処理に使いたい」という場面はよくあります。
その際に役立つのが 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行だけを取り出したい場合は skip
や tokens
を活用します。
@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
- 複数行から特定の部分 →
tokens
やdelims
を使う - 全体を保持 →
delims=
と遅延展開を組み合わせる - 高度な処理 → PowerShell を呼び出して結果を取り込む
これらを理解しておくと、バッチで外部コマンドをより柔軟に活用できるようになります。