Windowsコマンドプロンプトのfor /f処理は、ファイルやコマンド出力の内容を操作するための強力なツールです。本記事では、その基本的な使い方から応用例、そして具体的なバッチスクリプトの作成方法までを詳しく解説します。for /f処理をマスターすることで、日常的なタスクの自動化や効率化が可能になります。
読む前に:バッチと対話入力、処理できないデータ
例の%%iは.bat/.cmdファイル用です。コマンドプロンプトへ直接入力するときは%iにします。for /fは空行を飛ばし、既定では;で始まる行も読み飛ばします。delims=でもファイルの完全コピーにはなりません。
空白を含むファイル名にはusebackqと二重引用符を使います。カンマ区切りの例は引用符・空フィールド・フィールド内改行のない教材用データに限定し、一般CSVの解析にはCSV対応の処理系を使ってください。入力に&、|、!などがある場合はCMDの解釈にも注意が必要です。
書き出し例は同名の出力ファイルを削除・上書きすることがあります。必ず複製した小さな教材用ファイルと専用フォルダーで確認し、機密ログや本番ファイルを直接使わないでください。ここでWindows実機による実行検証は行っていません。
for /fコマンドの基本構文
for /fコマンドは、ファイルの内容やコマンドの出力を行ごとに処理するために使用されます。基本構文は以下の通りです。
for /f ["オプション"] %%変数 in (セット) do コマンド [コマンドの引数]オプションの説明
for /fコマンドには、さまざまなオプションがあります。代表的なものを以下に示します。
tokens=x:各行をトークン(区切り文字で分割された部分)に分け、指定されたトークンを変数に割り当てます。delims=xxx:トークンの区切り文字を指定します。デフォルトはスペースとタブです。skip=n:ファイルの先頭から指定した行数をスキップします。eol=c:コメント行を指定します。行頭に指定した文字がある行はスキップされます。
基本的な使用例
次の例は、example.txtというファイルの各行を読み取り、各行を表示するfor /fコマンドの使い方です。
for /f "tokens=* delims=" %%a in (example.txt) do (
echo %%a
)このスクリプトでは、example.txtの各行が変数%%aに読み込まれ、echoコマンドで表示されます。
ファイルの各行を処理する
for /fコマンドを使用して、テキストファイルの各行を読み取って処理する方法を紹介します。このセクションでは、具体的な例を通じてその手順を説明します。
基本例:ファイルの行を読み取って表示する
次の例は、sample.txtというファイルの各行を読み取り、表示する方法です。
for /f "tokens=* delims=" %%i in (sample.txt) do (
echo %%i
)このスクリプトは、sample.txtの各行を変数%%iに読み込み、echoコマンドで表示します。tokens=*は行全体を読み取るために使用され、delims=は区切り文字を指定しないことを意味します。
例:行をフィルタリングして処理する
特定の条件を満たす行だけを処理する例を示します。次のスクリプトは、行の先頭が”Error”で始まる行だけを表示します。
for /f "tokens=* delims=" %%i in ('findstr "^Error" sample.txt') do (
echo %%i
)このスクリプトでは、findstrコマンドを使って”Error”で始まる行をフィルタリングし、その結果を%%iに読み込みます。
例:複数のトークンを処理する
次の例では、各行をスペースで区切り、複数のトークンを処理します。
for /f "tokens=1,2 delims= " %%i in (sample.txt) do (
echo First Token: %%i
echo Second Token: %%j
)このスクリプトは、sample.txtの各行をスペースで区切り、最初のトークンを%%iに、2番目のトークンを%%jに読み込みます。
これらの例を通じて、for /fコマンドを使ったファイル処理の基本を理解することができます。次のセクションでは、コマンド出力をfor /fで処理する方法について説明します。
コマンド出力を処理する
for /fコマンドは、ファイルの内容だけでなく、他のコマンドの出力を行ごとに処理することもできます。このセクションでは、その方法を具体的な例とともに解説します。
コマンド出力の基本的な処理
次の例は、dirコマンドの出力をfor /fコマンドで処理し、各ファイル名を表示する方法です。
for /f "tokens=* delims=" %%i in ('dir /b') do (
echo %%i
)このスクリプトは、dir /bコマンドの出力(ディレクトリ内のファイルとフォルダー名)を行ごとに変数%%iに読み込み、echoコマンドで表示します。
複数のトークンを処理する例
次の例では、tasklistのCSV形式の各出力行を分割せず表示します。プロセス名の空白やメモリ値の桁区切りを含むため、固定の第5トークンを数値として取り出す方法は使いません。
for /f "delims=" %%i in ('tasklist /fo csv /nh') do (
echo %%i
)CSVの列を正確に解析する必要があるときは、引用符を扱えるCSVパーサーを使います。この例は1行ずつ表示する練習です。
コマンド出力のフィルタリング
次の例では、ipconfigコマンドの出力からIPv4アドレスを抽出して表示します。
for /f "tokens=2 delims=:" %%i in ('ipconfig ^| findstr "IPv4"') do (
echo IPv4アドレス: %%i
)このスクリプトでは、ipconfigコマンドの出力をfindstrコマンドでフィルタリングし、”IPv4″を含む行の2番目のトークンを%%iに読み込みます。
複雑なコマンドの出力処理
次の例では、netstatコマンドの出力を処理して、アクティブな接続の情報を抽出します。
for /f "tokens=1,2,3 delims= " %%i in ('netstat -an ^| findstr "ESTABLISHED"') do (
echo プロトコル: %%i
echo ローカルアドレス: %%j
echo リモートアドレス: %%k
)このスクリプトは、netstat -anコマンドの出力から”ESTABLISHED”接続をフィルタリングし、プロトコル、ローカルアドレス、リモートアドレスをそれぞれ%%i、%%j、%%kに読み込みます。
これらの例を通じて、for /fコマンドを使ったコマンド出力の処理方法を理解することができます。次のセクションでは、トークンとデリミタの使い方について詳しく説明します。
トークンとデリミタの使い方
for /fコマンドは、トークンとデリミタを利用して行を細かく分割し、それぞれの部分を処理することができます。このセクションでは、トークンとデリミタの使い方を具体例とともに解説します。
トークンの基本
トークンとは、行を区切り文字(デリミタ)で分割した各部分のことです。for /fコマンドでは、tokensオプションを使用して、どのトークンを変数に格納するかを指定します。
for /f "tokens=1,2,3 delims=," %%a in (sample.csv) do (
echo %%a %%b %%c
)このスクリプトは、sample.csvファイルの各行をカンマで分割し、最初の3つのトークンを%%a、%%b、%%cに格納して表示します。
デリミタの指定
デリミタは、行を分割するために使用される文字です。delimsオプションを使用してデリミタを指定できます。デフォルトでは、スペースとタブがデリミタとして使用されます。
for /f "tokens=1,2 delims=:" %%a in (data.txt) do (
echo %%a
echo %%b
)このスクリプトは、data.txtファイルの各行をコロンで分割し、最初の2つのトークンを%%aと%%bに格納して表示します。
複数のデリミタを使用する
次の例では、複数のデリミタ(スペースとコロン)を使用して行を分割します。
for /f "tokens=1,2 delims= :," %%a in (data.txt) do (
echo Token 1: %%a
echo Token 2: %%b
)このスクリプトは、data.txtファイルの各行をスペース、コロン、およびカンマで分割し、最初の2つのトークンを表示します。
トークン範囲の指定
tokensオプションでは、トークン範囲を指定することも可能です。次の例では、最初のトークンと4番目から最後のトークンを格納します。
for /f "tokens=1,4* delims=," %%a in (data.txt) do (
echo First Token: %%a
echo Fourth Token: %%b
echo Rest: %%c
)このスクリプトは、data.txtファイルの各行をカンマで分割し、最初のトークンを%%aに、4番目のトークンを%%bに、その後の残りを%%cに格納して表示します。
例外の処理
for /fコマンドは、特定の行をスキップするためのオプションも提供します。次の例では、最初の2行をスキップします。
for /f "skip=2 tokens=1,2 delims=," %%a in (data.txt) do (
echo %%a %%b
)このスクリプトは、data.txtファイルの最初の2行をスキップし、3行目以降の各行を処理します。
これらの例を通じて、トークンとデリミタの使い方を理解することができます。次のセクションでは、具体的な応用例を紹介します。
応用例1:ファイルの内容をフィルタリング
for /fコマンドを使用して、ファイルの特定の行を抽出して処理する方法を紹介します。このセクションでは、具体的な例を通じて、その手順を説明します。
特定のキーワードを含む行を抽出
次の例は、log.txtファイルから”ERROR”というキーワードを含む行を抽出して表示する方法です。
for /f "tokens=* delims=" %%i in ('findstr "ERROR" log.txt') do (
echo %%i
)このスクリプトでは、findstrコマンドを使用してlog.txtから”ERROR”を含む行を抽出し、その結果を%%iに格納して表示します。
特定の文字を含む候補行を抽出
次は@を含む行を抽出するだけの例です。メールアドレスの妥当性検証ではありません。findstrは一般的な正規表現エンジンと異なり、+や{2,}などを同じ意味では使えません。
for /f "delims=" %%i in ('findstr /l /c:"@" data.txt') do (
echo %%i
)
複数の条件を組み合わせてフィルタリング
次の例では、複数のキーワードを組み合わせて行をフィルタリングします。例として、”ERROR”と”WARNING”を含む行を抽出します。
for /f "tokens=* delims=" %%i in ('findstr /c:"ERROR" /c:"WARNING" log.txt') do (
echo %%i
)このスクリプトは、findstrコマンドを使って”ERROR”または”WARNING”を含む行を抽出し、その結果を表示します。
特定の列をフィルタリング
次の例では、CSVファイルの特定の列を条件にフィルタリングします。ここでは、2番目の列に”Active”が含まれる行を抽出します。
for /f "tokens=1,2 delims=," %%i in (data.csv) do (
if "%%j"=="Active" echo %%i, %%j
)このスクリプトは、data.csvファイルをカンマで区切り、2番目の列が”Active”である行を抽出して表示します。
これらの応用例を通じて、for /fコマンドを使ったファイル内容のフィルタリング方法を理解することができます。次のセクションでは、コマンド出力の集計方法について紹介します。
応用例2:コマンド出力の集計
for /fコマンドを使用して、コマンドの出力結果を集計する方法を紹介します。このセクションでは、具体的な例を通じて、その手順を説明します。
ファイルサイズとプロセス情報は表示形式に注意する
dirの日時付き一覧を固定の第5列で集計すると、地域設定や表示形式で別の値を拾います。まず通常のforとサイズ修飾子で、対象フォルダー直下のファイルを1件ずつ確認します。フォルダー全体の合計や再帰集計ではありません。
for %%F in ("C:\TargetDirectory\*") do @echo "%%~fF" %%~zF bytes
tasklistの整形済み表示も、桁区切りやプロセス名の空白を含むため、固定列をset /aへ渡す集計には不向きです。次はtasklist自体のフィルターでメモリ使用量100000KB超のプロセスを表示する例です。全プロセスの合計ではありません。
tasklist /fi "MEMUSAGE gt 100000" /fo table
ネットワーク接続数の集計
次の例では、netstatコマンドを使用して、特定の状態にあるネットワーク接続数を集計します。例として、”ESTABLISHED”状態の接続数を集計します。
set count=0
for /f "tokens=1 delims= " %%i in ('netstat -an ^| findstr "ESTABLISHED"') do (
set /a count+=1
)
echo Number of ESTABLISHED connections: %count%このスクリプトは、netstat -anコマンドの出力から”ESTABLISHED”状態の接続を抽出し、その数をカウントします。
ログファイルのエラーメッセージの集計
次の例では、ログファイルから”ERROR”を含む処理対象行数を集計します。
set errorCount=0
for /f "tokens=* delims=" %%i in ('findstr /c:"ERROR" log.txt') do (
set /a errorCount+=1
)
echo Number of ERROR messages: %errorCount%このスクリプトは、findstrコマンドを使用してログファイルから”ERROR”メッセージを抽出し、その処理対象行数をカウントします。同じ行にERRORが2回あっても1行として数えます。
これらの応用例を通じて、for /fコマンドを使ったコマンド出力の集計方法を理解することができます。次のセクションでは、実用的なバッチスクリプトの作成例を紹介します。
応用例3:バッチスクリプトの作成
for /fコマンドを利用して、実用的なバッチスクリプトを作成する方法を紹介します。このセクションでは、具体的なシナリオに基づいたスクリプトを例に挙げて解説します。
ユーザーリストから特定の情報を抽出するスクリプト
次の例は、ユーザーリストファイルから特定の情報を抽出し、別のファイルに保存するスクリプトです。ここでは、ユーザーの名前とメールアドレスを抽出します。
@echo off
setlocal enabledelayedexpansion
set outputFile=filtered_users.txt
del %outputFile% 2>nul
for /f "tokens=1,3 delims=, " %%i in (users.csv) do (
echo Name: %%i, Email: %%j >> %outputFile%
)
echo Filtered user information has been saved to %outputFile%このスクリプトは、users.csvファイルの各行を読み取り、1番目のトークン(ユーザー名)と3番目のトークン(メールアドレス)を抽出して、filtered_users.txtファイルに保存します。
古いログは削除前に候補だけを表示する
バックアップの成功確認なしに削除へ進む処理は避けます。以下は最終更新日が30日前以前の.logファイルを表示するだけで、コピーや削除は行いません。対象と保存期間を確認し、バックアップから復元できることを別途検証してから整理を判断します。
forfiles /p "C:\Logs" /m *.log /d -30 /c "cmd /c if @isdir==FALSE echo @path"
対象がない場合やパスに問題がある場合のメッセージも確認してください。forfilesはfor /fとは別コマンドで、この用途では出力を無理に二重処理する必要はありません。
ネットワーク設定のレポートを生成するスクリプト
次の例では、ネットワーク設定を取得し、レポートファイルに保存するスクリプトです。
@echo off
setlocal
set reportFile=network_report.txt
del %reportFile% 2>nul
echo Network Configuration Report >> %reportFile%
echo ============================ >> %reportFile%
ipconfig /all >> %reportFile%
echo. >> %reportFile%
echo Active Connections >> %reportFile%
echo =================== >> %reportFile%
netstat -an >> %reportFile%
echo Network report has been saved to %reportFile%このスクリプトは、ipconfig /allとnetstat -anのコマンド出力をnetwork_report.txtファイルに保存し、ネットワーク設定のレポートを生成します。
これらの実用的なバッチスクリプトの例を通じて、for /fコマンドを活用したタスクの自動化方法を理解することができます。次のセクションでは、学んだ内容を確認するための演習問題を提供します。
演習問題
学んだ内容を確認し、理解を深めるために、以下の演習問題に挑戦してみてください。これらの問題を通じて、for /fコマンドの使用方法や応用例を実践的に理解することができます。
演習問題1:特定の文字列を含む行をファイルに保存
log.txtファイルから”WARNING”という文字列を含む行を抽出し、それらをwarnings.txtファイルに保存するスクリプトを作成してください。
@echo off
setlocal
set inputFile=log.txt
set outputFile=warnings.txt
del %outputFile% 2>nul
for /f "tokens=* delims=" %%i in ('findstr "WARNING" %inputFile%') do (
echo %%i >> %outputFile%
)
echo Lines containing "WARNING" have been saved to %outputFile%演習問題2:ファイル名とサイズを確認する
テスト用フォルダーのファイル名とバイト数を表示します。ここでは表示だけを行い、合計やファイル削除はしません。
@echo off
for %%F in ("C:\TargetDirectory\*") do (
echo "%%~fF" %%~zF bytes
)
演習問題3:CPU時間でプロセスを絞る
tasklistのCPU時間はHH:MM:SS形式の累積時間で、瞬間的なCPU使用率ではありません。次はCPU時間が1分を超えるプロセスを表示する例です。50%以上使用中のプロセス抽出とは異なります。
tasklist /v /fi "CPUTIME gt 00:01:00"
演習問題4:特定のフォーマットのデータを解析
data.csvファイルから、2番目の列が”Completed”の行を抽出し、それらをcompleted_tasks.txtファイルに保存するスクリプトを作成してください。
@echo off
setlocal
set inputFile=data.csv
set outputFile=completed_tasks.txt
del %outputFile% 2>nul
for /f "tokens=1,2 delims=," %%i in (%inputFile%) do (
if "%%j"=="Completed" echo %%i, %%j >> %outputFile%
)
echo Completed tasks have been saved to %outputFile%演習問題5:ネットワーク接続の統計情報を取得
netstatコマンドを使用して、”LISTENING”状態のネットワーク接続数をカウントし、その結果をnetwork_stats.txtファイルに保存するスクリプトを作成してください。
@echo off
setlocal
set outputFile=network_stats.txt
set count=0
del %outputFile% 2>nul
for /f "tokens=1 delims= " %%i in ('netstat -an ^| findstr "LISTENING"') do (
set /a count+=1
)
echo Number of LISTENING connections: %count% > %outputFile%
echo Network connection statistics have been saved to %outputFile%これらの演習問題に取り組むことで、for /fコマンドを用いたスクリプト作成のスキルを実践的に身に付けることができます。次のセクションでは、この記事の内容を総括します。
まとめ
この記事では、Windowsコマンドプロンプトのfor /f処理の基本から応用までを詳しく解説しました。以下のポイントを押さえておくことで、日常のタスクを効率的に自動化することができます。
基本の理解
for /fコマンドの基本構文と主要なオプション(tokens、delims、skipなど)の使い方を学びました。これらの基礎知識をもとに、ファイルやコマンドの出力を行ごとに処理する方法を理解しました。
応用例と実践的なスクリプト
ファイルの内容をフィルタリングする方法や、コマンド出力を集計する具体例を通じて、実践的なスクリプトの作成方法を学びました。特に、ファイルサイズの表示、プロセスの条件抽出、ネットワーク接続の状態の集計は、目的と出力形式を区別して使ってください。
演習問題での実践
演習問題を通じて、実際にスクリプトを作成し、for /fコマンドの使用方法を実践的に理解しました。これにより、自分でスクリプトを作成し、業務の効率化を図るスキルを磨くことができました。
for /fコマンドは、Windowsコマンドプロンプトの中でも強力なツールの一つです。この記事を参考に、さらに高度なスクリプトを作成し、自動化の幅を広げてください。



コメント