PowerShellのループ処理(foreach・for・while・do-while)を解説します。コレクション操作はPowerShellの真骨頂であり、バッチファイルのfor文より直感的に書けます。
foreach文(コレクションの繰り返し)
$fruits = @("Apple", "Banana", "Cherry", "Grape")
foreach ($fruit in $fruits) {
Write-Host "フルーツ: $fruit"
}
# ファイル一覧をループ処理
foreach ($file in Get-ChildItem -Path C:\work -Filter *.txt) {
Write-Host "ファイル: $($file.Name) サイズ: $($file.Length)bytes"
}ForEach-Object(パイプライン版)
PowerShellらしい書き方は、パイプライン(|)とForEach-Objectを組み合わせる方法です。
# パイプラインで処理
Get-ChildItem -Path C:\work -Filter *.log |
ForEach-Object {
Write-Host "処理中: $($_.Name)"
# $_ は現在のオブジェクトを指す
}
# 省略形(%)
1..10 | % { Write-Host "$_ の二乗は $($_ * $_)" }
# 範囲演算子(..)で数列を生成
1..5 # 1,2,3,4,5
10..1 # 10,9,8,7,6,5,4,3,2,1
"a".."e" # a,b,c,d,e(文字も可)for文(カウンターループ)
for ($i = 0; $i -lt 10; $i++) {
Write-Host "カウント: $i"
}
# 逆順
for ($i = 10; $i -ge 1; $i--) {
Write-Host "$i..."
}while・do-while文
# while:条件が真の間繰り返す
$count = 0
while ($count -lt 5) {
Write-Host "count: $count"
$count++
}
# do-while:最低1回は実行
$input = ""
do {
$input = Read-Host "yesまたはnoを入力してください"
} while ($input -ne "yes" -and $input -ne "no")
Write-Host "入力: $input"
# break・continue
foreach ($n in 1..20) {
if ($n % 2 -eq 0) { continue } # 偶数はスキップ
if ($n -gt 10) { break } # 10超えたら終了
Write-Host $n
}配列の操作
$arr = @(3, 1, 4, 1, 5, 9, 2, 6)
# 要素数
$arr.Count # 8
# インデックスアクセス
$arr[0] # 3(先頭)
$arr[-1] # 6(末尾)
# ソート・逆順
$arr | Sort-Object # 昇順
$arr | Sort-Object -Descending # 降順
# フィルタリング
$arr | Where-Object { $_ -gt 4 } # 4より大きい要素だけ
# 要素追加(+=は新しい配列を作る)
$arr += 7
# 高速な追加にはArrayListを使う
$list = New-Object System.Collections.ArrayList
$list.Add("item1") | Out-Null
$list.Add("item2") | Out-NullPowerShellで処理速度が遅いと感じたら、まず配列への+=を疑ってください。+=は毎回新しい配列を作るため、ループ内で数千回繰り返すと著しく遅くなります。ArrayListかList[T]を使うと劇的に改善します。
hobbyshift管理人
まとめ
- foreachはコレクションの繰り返しに最適。foreach ($item in $collection)の形式
- パイプライン+ForEach-ObjectはPowerShellらしい書き方で$_が現在の要素を指す
- 範囲演算子(1..10)でシンプルに数列・文字列の連番を生成できる
- 配列への+=はループ内では避け、ArrayListを使うと高速



コメント