Windows PowerShell でファイルを 1 行ずつ読む方法
-
Get-Content
を使用して PowerShell で行単位でファイルを読み取る(ForEach
ループ付き) -
Get-Content
とForeach-Object
を使用して PowerShell で行単位でファイルを読み取る -
PowerShell でファイルを行単位で読み取るための
[System.IO.File]
クラスを使用する -
PowerShell でファイルを行単位で読み取るための
System.IO.StreamReader
クラスを使用する - 結論

Windows PowerShell では、Get-Content
コマンドレットを使用してファイルからコンテンツを読み取ることができます。しかし、このコマンドレットはファイルの内容を一度にメモリに読み込むため、大きなファイルでは失敗したりフリーズしたりします。
この問題を解決するために、私たちはファイルを行単位で読み取ることができ、この文書ではその方法を示します。
始める前に、複数行のサンプルテキストファイルを作成するのが良いでしょう。たとえば、以下の行が含まれている file.txt
を作成しました。
file.txt
:
one
two
three
four
five
six
seven
eight
nine
ten
Microsoft によると、正規表現はテキストと一致させるためのパターンです。それはリテラル文字、演算子、およびその他の構造から構成される可能性があります。この文書では、$regex
として示される標準変数を含む異なるスクリプトを試みます。
Get-Content
を使用して PowerShell で行単位でファイルを読み取る(ForEach
ループ付き)
最初に、Get-Content
コマンドレットには、大きなファイルを読み込むときに欠点があることを議論しました。このコマンドレットはファイルの内容を一度にメモリに読み込むからです。しかし、foreach
ループを使用して行を一つずつ読み込むことで改善できます。
例コード:
foreach ($line in Get-Content .\file.txt) {
if ($line -match $regex) {
Write-Output $line
}
}
プロセスのステップバイステップの説明は以下の通りです:
-
ファイルコンテンツの取得:
Get-Content
コマンドレットを使用してファイルの内容を読み取ることから始めます。Get-Content .\file.txt
"file.txt"
をファイルのパスに置き換えてください。 -
各行を繰り返す:
次に、ファイル内の各行を反復処理するために
ForEach
ループを使用します。ループは、各行を変数$line
に一度に一つずつ割り当てます。ループ内では、
Write-Host $line
を置き換えて、要件に応じて各行を処理するコードを追加できます。この例では、単にWrite-Host
を使用して各行を表示していますが、望ましいアクションを実行できます。
Get-Content
と Foreach-Object
を使用して PowerShell で行単位でファイルを読み取る
Get-Content
を使用して PowerShell でファイルを行単位で読み取るには、以下の手順に従ってください:
-
Get-Content
コマンドレットを使用:Get-Content
コマンドレットを使用してファイルの内容を読み取ることから始めます。Get-Content
コマンドレットはファイルの各行を読み取り、パイプライン内のオブジェクトとして出力します。powershellCopy codeGet-Content -Path "example.txt" | ForEach-Object { # Process each line here $_ # $_ represents the current line }
"example.txt"
をファイルのパスに置き換えてください。
-
Foreach-Object ループ:
次に、
Foreach-Object
コマンドレット(%
はForeach-Object
のエイリアスです)を使用してパイプライン内の各行を反復処理します。スクリプトブロック内({}
内のコード)では、$_
を使用して現在処理中の行を表現し、各行を処理できます。powershellCopy codeGet-Content -Path "example.txt" | ForEach-Object { # Process each line here $_ # $_ represents the current line }
このループ内で、各行に対して必要なアクションを実行できます。
完全な動作コード例
以下は、ファイルを行単位で読み取り、各行を表示する完全な動作コード例です:
powershellCopy code# Specify the path to the file
$filePath = "example.txt"
# Check if the file exists
if (Test-Path $filePath) {
# Read the file line by line and process each line
Get-Content -Path $filePath | ForEach-Object {
# Process each line here
Write-Host $_
}
} else {
Write-Host "File not found: $filePath"
}
このコードでは:
$filePath
変数を使用してファイルのパスを指定します。Test-Path
コマンドレットを使用してファイルが存在するか確認します。- ファイルが存在する場合は、
Get-Content
を使用してその内容を読み取り、Foreach-Object
に渡して処理します。 Foreach-Object
のスクリプトブロック内でWrite-Host $_
を使用して各行を表示します。
PowerShell でファイルを行単位で読み取るための [System.IO.File]
クラスを使用する
PowerShell で [System.IO.File]
クラスを使用してファイルを行単位で読み取るには、以下の手順に従ってください:
-
ファイルパスの指定:
読み取るファイルのパスを指定することから始めます。
"example.txt"
をファイルの実際のパスに置き換えてください。powershellCopy code $filePath = "example.txt"
-
ファイルが存在するか確認:
ファイルを読み取る前に、
Test-Path
コマンドレットを使用してファイルが存在するか確認することが良いプラクティスです:powershellCopy codeif (Test-Path $filePath) { # File exists, proceed with reading } else { Write-Host "File not found: $filePath" }
-
ファイルを行単位で読み取る:
ファイルが存在することを確認したら、
[System.IO.File]
クラスを使用してファイルを行単位で読み取ることができます。以下はそのためのコードです:powershellCopy codetry { $lines = [System.IO.File]::ReadLines($filePath) foreach ($line in $lines) { # Process each line here Write-Host $line } } catch { Write-Host "Error reading the file: $_" }
このコードでは:
[System.IO.File]
クラスのReadLines
メソッドを使用してファイルを行単位で読み取り、行を$lines
変数に格納します。- その後、
foreach
ループを使用して$lines
内の各行を反復処理します。この例では、単にWrite-Host
を使用して各行を表示していますが、望ましいアクションを実行できます。
完全な動作コード例
以下は、ファイルを行単位で読み取り、各行を表示する完全な動作コード例です:
powershellCopy code# Specify the path to the file
$filePath = "example.txt"
# Check if the file exists
if (Test-Path $filePath) {
try {
# Read the file line by line
$lines = [System.IO.File]::ReadLines($filePath)
foreach ($line in $lines) {
# Process each line here
Write-Host $line
}
} catch {
Write-Host "Error reading the file: $_"
}
} else {
Write-Host "File not found: $filePath"
}
このコードでは:
$filePath
変数を使用してファイルのパスを指定します。Test-Path
を使用してファイルが存在するか確認します。- ファイルが存在する場合、
[System.IO.File]::ReadLines()
メソッドを使用してファイルを行単位で読み取り、foreach
ループを使用して各行を処理します。 - ファイルの読み取り中に発生する可能性のある例外をキャッチするエラーハンドリングを含めています。
PowerShell でファイルを行単位で読み取るための System.IO.StreamReader
クラスを使用する
PowerShell で System.IO.StreamReader
クラスを使用してファイルを行単位で読み取るには、以下の手順に従ってください:
-
ファイルパスの指定:
読み取るファイルのパスを指定することから始めます。
"example.txt"
をファイルの実際のパスに置き換えてください。powershellCopy code $filePath = "example.txt"
-
ファイルが存在するか確認:
ファイルを読み取る前に、
Test-Path
コマンドレットを使用してファイルが存在するか確認することが良いプラクティスです:powershellCopy codeif (Test-Path $filePath) { # File exists, proceed with reading } else { Write-Host "File not found: $filePath" }
-
ファイルを行単位で読み取る:
ファイルが存在することを確認したら、
System.IO.StreamReader
クラスを使用してファイルを行単位で読み取ることができます。以下はそのためのコードです:
powershellCopy codetry {
$reader = [System.IO.StreamReader]::new($filePath)
while ($reader.Peek() -ge 0) {
$line = $reader.ReadLine()
# Process each line here
Write-Host $line
}
$reader.Close()
} catch {
Write-Host "Error reading the file: $_"
}
このコードでは:
[System.IO.StreamReader]::new($filePath)
を使用してSystem.IO.StreamReader
の新しいインスタンスを作成します。ここで、$filePath
はファイルのパスです。while
ループを使用してファイルを行単位で読み取ります。$reader.Peek() -ge 0
条件により、ファイルの終わりまで読み続けます。- ループ内では
$reader.ReadLine()
を使用して各行を読み取り、必要に応じて処理します。この例では、単にWrite-Host
を使用して各行を表示していますが、望ましいアクションを実行できます。 - 最後に、ファイルリソースを解放するために
$reader.Close()
を使用してStreamReader
を閉じます。
完全な動作コード例
以下は、ファイルを行単位で読み取り、各行を表示する完全な動作コード例です:
powershellCopy code# Specify the path to the file
$filePath = "example.txt"
# Check if the file exists
if (Test-Path $filePath) {
try {
# Create a StreamReader to read the file
$reader = [System.IO.StreamReader]::new($filePath)
# Read the file line by line
while ($reader.Peek() -ge 0) {
$line = $reader.ReadLine()
# Process each line here
Write-Host $line
}
# Close the StreamReader
$reader.Close()
} catch {
Write-Host "Error reading the file: $_"
}
} else {
Write-Host "File not found: $filePath"
}
このコードでは:
$filePath
変数を使用してファイルのパスを指定します。Test-Path
を使用してファイルが存在するか確認します。- ファイルが存在する場合、
System.IO.StreamReader
インスタンスを作成してファイルを行単位で読み取ります。そしてwhile
ループを使用して各行を処理します。 - ファイルの読み取り中に発生する可能性のある例外をキャッチするためのエラーハンドリングも含めています。
結論
要約すると、PowerShell はファイルを行単位で読み取るためのいくつかの柔軟な方法を提供しており、さまざまなスクリプトや自動化のニーズに対応しています。Get-Content
と ForEach
ループは、単純なタスクに対する使いやすい選択肢であり、シンプルさと可読性を提供します。Get-Content
と Foreach-Object
は柔軟性を高め、パイプライン内でより複雑な操作やフィルタリングタスクに適しています。
より高い制御と包括的なエラーハンドリングが必要なシナリオでは、[System.IO.File]
クラスが強力なソリューションを提供します。この方法ではファイル操作を微調整し、エラーを優雅に処理できるため、堅牢でエラー耐性のあるスクリプトに適しています。
大きなファイルを処理し、メモリ効率が重要な場合は、System.IO.StreamReader
クラスが優れています。これはファイルを効率的に読み取り、大量のデータセットのスムーズな処理を確保しつつ、メモリリソースをより効果的に管理します。
最終的に、使用する方法の選択は、特定のスクリプトの要件、ファイルサイズ、および処理の複雑性に依存します。これらの方法を利用することで、PowerShell でファイルを行単位で自信を持って読み取り、自動化ワークフロー内のさまざまなファイル関連のタスクに効果的に対処できます。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn