Windowsコマンドプロンプトのfor /f処理をマスターする

Windowsコマンドプロンプトのfor /f処理は、ファイルやコマンド出力の内容を操作するための強力なツールです。本記事では、その基本的な使い方から応用例、そして具体的なバッチスクリプトの作成方法までを詳しく解説します。for /f処理をマスターすることで、日常的なタスクの自動化や効率化が可能になります。

目次

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コマンドの出力からプロセス名とメモリ使用量を抽出して表示します。

for /f "tokens=1,5 delims= " %%i in ('tasklist') do (
    echo プロセス名: %%i
    echo メモリ使用量: %%j
)

このスクリプトは、tasklistコマンドの出力をスペースで区切り、最初のトークンを%%iに、5番目のトークンを%%jに読み込みます。

コマンド出力のフィルタリング

次の例では、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 and Rest Tokens: %%b
)

このスクリプトは、data.txtファイルの各行をカンマで分割し、最初のトークンを%%aに、4番目以降のトークンを%%bに格納して表示します。

例外の処理

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に格納して表示します。

特定の形式に一致する行を抽出

次の例では、データファイルからメールアドレスの形式に一致する行を抽出します。

for /f "tokens=* delims=" %%i in ('findstr /r "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" data.txt') do (
    echo %%i
)

このスクリプトは、findstrコマンドの正規表現を使ってメールアドレス形式の行を抽出し、その結果を表示します。

複数の条件を組み合わせてフィルタリング

次の例では、複数のキーワードを組み合わせて行をフィルタリングします。例として、”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コマンドの出力を使用して、特定のディレクトリ内の全ファイルのサイズを集計する方法です。

setlocal enabledelayedexpansion
set totalSize=0

for /f "tokens=5 delims= " %%i in ('dir /s /-c ^| findstr /r "^[0-9]"') do (
    set /a totalSize+=%%i
)

echo Total Size: !totalSize! bytes

このスクリプトは、dir /s /-cコマンドでディレクトリ内の全ファイルのサイズを取得し、findstrでフィルタリングした後、各ファイルのサイズを変数totalSizeに加算して集計します。

プロセスのメモリ使用量の集計

次の例では、tasklistコマンドを使用して、すべてのプロセスのメモリ使用量を集計します。

setlocal enabledelayedexpansion
set totalMemory=0

for /f "tokens=5 delims= " %%i in ('tasklist ^| findstr "K"') do (
    set mem=%%i
    set mem=!mem:K=!
    set /a totalMemory+=mem
)

echo Total Memory Usage: !totalMemory! KB

このスクリプトは、tasklistコマンドの出力からメモリ使用量の列を抽出し、すべてのプロセスのメモリ使用量を合計して表示します。

ネットワーク接続数の集計

次の例では、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”メッセージを抽出し、その出現回数をカウントします。

これらの応用例を通じて、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ファイルに保存します。

ログファイルのバックアップと整理を行うスクリプト

次の例では、ログファイルを定期的にバックアップし、古いログを整理するスクリプトです。

@echo off
setlocal

set logDir=C:\Logs
set backupDir=C:\LogBackups

:: Create backup directory if it doesn't exist
if not exist %backupDir% mkdir %backupDir%

:: Backup logs
for /f "tokens=* delims=" %%i in ('dir /b %logDir%\*.log') do (
    copy "%logDir%\%%i" "%backupDir%\%%i.bak"
)

:: Delete logs older than 30 days
for /f "tokens=* delims=" %%i in ('forfiles /p %logDir% /m *.log /d -30 /c "cmd /c del @path"') do (
    echo Deleted old log: %%i
)

echo Log backup and cleanup completed.

このスクリプトは、指定されたログディレクトリ内のすべてのログファイルをバックアップディレクトリにコピーし、30日以上前のログファイルを削除します。

ネットワーク設定のレポートを生成するスクリプト

次の例では、ネットワーク設定を取得し、レポートファイルに保存するスクリプトです。

@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 /allnetstat -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:ディスクの使用状況を集計

dirコマンドを使用して、指定されたディレクトリ内の全ファイルのサイズを集計し、total_size.txtファイルに保存するスクリプトを作成してください。

@echo off
setlocal enabledelayedexpansion

set targetDir=C:\TargetDirectory
set outputFile=total_size.txt

del %outputFile% 2>nul
set totalSize=0

for /f "tokens=5 delims= " %%i in ('dir /s /-c %targetDir% ^| findstr /r "^[0-9]"') do (
    set /a totalSize+=%%i
)

echo Total Size: !totalSize! bytes > %outputFile%
echo Total size has been calculated and saved to %outputFile%

演習問題3:プロセスのCPU使用率をフィルタリング

tasklistコマンドを使用して、CPU使用率が50%以上のプロセスを抽出し、その情報をhigh_cpu_usage.txtファイルに保存するスクリプトを作成してください。

@echo off
setlocal enabledelayedexpansion

set outputFile=high_cpu_usage.txt

del %outputFile% 2>nul

for /f "tokens=1,3,8 delims= " %%i in ('tasklist /v ^| findstr "Console"') do (
    set cpu=%%k
    set cpu=!cpu:~0,-1!
    if !cpu! GEQ 50 echo Process: %%i, PID: %%j, CPU Usage: %%k >> %outputFile%
)

echo Processes with CPU usage 50% or higher have been saved to %outputFile%

演習問題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コマンドプロンプトの中でも強力なツールの一つです。この記事を参考に、さらに高度なスクリプトを作成し、自動化の幅を広げてください。

コメント

コメントする

目次