本日はPowerShellの小ネタ枠です。
PowerShellでコレクションに対して繰り返し処理を行う方法です。
コレクションに対して繰り返し処理を行う
PowerShellでコレクションに対して繰り返し処理を行うには主に2種類の方法があります。
・ForEach-Objectコマンドレット
・foreachステートメント
ForEach-Objectコマンドレット
ForEach-Objectコマンドレットは入力されたコレクションの各項目に対して操作を実行します。
learn.microsoft.com
# コレクションをForEach-Objectを使って1つずつ標準出力する @("alpha","beta","gamma","delta") | ForEach-Object {Write-Host $_}

foreachステートメント
foreachステートメントは与えられたコレクション内の各項目に対して操作を実行します。
learn.microsoft.com
# コレクションをforeachを使って1つずつ標準出力する $collection = @("alpha","beta","gamma","delta") foreach($element in $collection){ Write-Host $element }

ForEach-Objectとforeachの違い
処理を行う際、ForEach-Objectは要素を1つずつ読み込み、foreachは要素を初めに全て読み込むという違いがあります。
このため、大量のデータを処理する際にはforeachは大量のメモリを使用する可能性があります。
サンプルスクリプト
引数で指定されたフォルダの全てのファイル名を表示する以下のサンプルクリプトを作成しました。
・filenamecheck.ps1
# 第一引数を受け取る # 引数を指定していない場合は対話形式で引数の入力を要求する Param( [parameter(mandatory)][String]$argment01 ) # 第一引数をフォルダパスとして指定する $folderPath = $argment01 # Test-Pathで指定したパスが存在するかどうかを確認する if (-Not (Test-Path $folderPath)) { Write-Host "指定されたフォルダが見つかりません: $folderPath" -ForegroundColor Red exit } # Get-ChildItemでフォルダ内のすべてのファイル名を取得して標準出力する # -Path:取得対象のパスを指定する # -File:ファイルのみを指定する # -Name:項目の名前のみを取得する Get-ChildItem -Path $folderPath -File -Name | ForEach-Object { # $_にファイル名が引き渡される Write-Host $_ }
