WindowsPowerShell

PowerShellのループ処理【foreach・for・while・do-while・配列操作を完全解説】

WindowsPowerShell
記事内に広告が含まれています。

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-Null

PowerShellで処理速度が遅いと感じたら、まず配列への+=を疑ってください。+=は毎回新しい配列を作るため、ループ内で数千回繰り返すと著しく遅くなります。ArrayListかList[T]を使うと劇的に改善します。

hobbyshift管理人

まとめ

  • foreachはコレクションの繰り返しに最適。foreach ($item in $collection)の形式
  • パイプライン+ForEach-ObjectはPowerShellらしい書き方で$_が現在の要素を指す
  • 範囲演算子(1..10)でシンプルに数列・文字列の連番を生成できる
  • 配列への+=はループ内では避け、ArrayListを使うと高速

コメント

タイトルとURLをコピーしました