Windows PowerShellで配列をループ処理する方法|初心者向けにわかりやすく解説

Windows

「複数のデータを一括で処理したい」
「同じコマンドを色々な値に繰り返したい」

そんなときに便利なのがPowerShellの配列ループ処理です。

この記事では、Windows PowerShellで配列を使い、それをループで処理する基本の方法をやさしく説明します。はじめてスクリプトを書く方にも理解できるよう、具体的な例を交えて解説します。

プログラミング経験がなくても大丈夫。一つずつ順番に覚えていけば、必ずできるようになります。

スポンサーリンク

PowerShellの配列とは?

配列って何?

配列は、複数の値をまとめて扱う「箱」のようなものです。

身近な例で考えてみましょう:

  • 買い物リスト:りんご、バナナ、ぶどう
  • 連絡先リスト:田中さん、佐藤さん、山田さん
  • サーバー一覧:Server1、Server2、Server3

これらを一つの変数にまとめて管理できるのが配列です。

PowerShellでの配列の作り方

PowerShellでは @() を使って簡単に配列を作れます。

基本的な配列の作成

# 文字列の配列
$colors = @("Red", "Green", "Blue")

# 数字の配列  
$numbers = @(1, 2, 3, 4, 5)

# 混在した配列
$mixed = @("Hello", 123, "World", 456)

配列の中身にアクセスする方法

配列の中身を取り出すには、インデックス(番号)を使います。

$colors = @("Red", "Green", "Blue")

# 最初の要素(インデックスは0から始まる)
Write-Host $colors[0]  # Red

# 2番目の要素
Write-Host $colors[1]  # Green

# 3番目の要素
Write-Host $colors[2]  # Blue

重要なポイント:

  • インデックスは0から始まる
  • $colors[0] が最初の要素
  • $colors[1] が2番目の要素

配列の便利な機能

$colors = @("Red", "Green", "Blue")

# 配列の要素数を確認
Write-Host $colors.Count  # 3

# 最後の要素を取得
Write-Host $colors[-1]  # Blue

# 複数の要素を一度に取得
Write-Host $colors[0,2]  # Red Blue

動的な配列の作成

配列は後から要素を追加することもできます。

# 空の配列から始める
$fruits = @()

# 要素を追加
$fruits += "Apple"
$fruits += "Banana"  
$fruits += "Orange"

Write-Host $fruits  # Apple Banana Orange

PowerShellのループで配列を処理する

基本のForEachループ

PowerShellで最もよく使うのが foreach です。

基本的な書き方

$colors = @("Red", "Green", "Blue")

foreach ($color in $colors) {
    Write-Host "色は $color です"
}

実行結果:

色は Red です
色は Green です  
色は Blue です

foreach文の構造解説

foreach ($変数名 in $配列名) {
    # ここに実行したい処理を書く
    # $変数名 に配列の要素が一つずつ入る
}

構文の説明:

  • $color:一時的な変数(名前は自由に決められる)
  • in:キーワード(固定)
  • $colors:処理したい配列
  • {}:実行する処理をここに書く

For文を使う方法

C言語風の for も使えます。インデックスが必要な場合に便利です。

基本的なfor文

$colors = @("Red", "Green", "Blue")

for ($i = 0; $i -lt $colors.Count; $i++) {
    Write-Host "$i 番目の色は $($colors[$i]) です"
}

実行結果:

0 番目の色は Red です
1 番目の色は Green です
2 番目の色は Blue です

for文の構造解説

for (初期化; 条件; 増分) {
    # 実行する処理
}

各部分の説明:

  • $i = 0:ループ変数の初期値
  • $i -lt $colors.Count:続行条件($iが配列の要素数未満の間)
  • $i++:ループのたびに$iを1増やす
  • $($colors[$i]):変数を式の中で使う場合の記法

While文を使ったループ

条件が満たされている間ループを続ける場合に使います。

$colors = @("Red", "Green", "Blue")
$i = 0

while ($i -lt $colors.Count) {
    Write-Host "[$i] $($colors[$i])"
    $i++
}

Do-While文とDo-Until文

# Do-While(条件が真の間続ける)
$colors = @("Red", "Green", "Blue")
$i = 0

do {
    Write-Host $colors[$i]
    $i++
} while ($i -lt $colors.Count)

# Do-Until(条件が真になるまで続ける)
$i = 0
do {
    Write-Host $colors[$i]
    $i++
} until ($i -ge $colors.Count)

パイプラインを使った配列処理

PowerShellの特徴的な機能として、パイプライン処理があります。

ForEach-Objectコマンドレット

$numbers = @(1, 2, 3, 4, 5)

# パイプラインでの処理
$numbers | ForEach-Object {
    Write-Host "数値: $_"
}

# 省略形
$numbers | % { Write-Host "数値: $_" }

Where-Objectでのフィルタリング

$numbers = @(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

# 偶数のみを抽出
$evenNumbers = $numbers | Where-Object { $_ % 2 -eq 0 }
Write-Host $evenNumbers  # 2 4 6 8 10

# 5より大きい数値のみを処理
$numbers | Where-Object { $_ -gt 5 } | ForEach-Object {
    Write-Host "大きい数値: $_"
}

配列ループの実用例

サーバーへのpingを順番に実行

$servers = @("192.168.1.1", "google.com", "yahoo.co.jp", "github.com")

foreach ($server in $servers) {
    Write-Host "[$server] を確認中..."
    
    if (Test-Connection $server -Count 1 -Quiet) {
        Write-Host "✓ $server に接続成功" -ForegroundColor Green
    } else {
        Write-Host "✗ $server に接続失敗" -ForegroundColor Red
    }
}

ファイル処理の自動化

# ログファイルのサイズをチェック
$logFiles = @("C:\Logs\app.log", "C:\Logs\error.log", "C:\Logs\access.log")

foreach ($file in $logFiles) {
    if (Test-Path $file) {
        $size = (Get-Item $file).Length / 1MB
        Write-Host "$file : $([math]::Round($size, 2)) MB"
    } else {
        Write-Host "$file : ファイルが見つかりません" -ForegroundColor Yellow
    }
}

フォルダ内のファイル一覧処理

# 指定フォルダ内の全ファイルを処理
$files = Get-ChildItem "C:\Temp" -File

foreach ($file in $files) {
    Write-Host "ファイル名: $($file.Name)"
    Write-Host "サイズ: $($file.Length) bytes"
    Write-Host "更新日時: $($file.LastWriteTime)"
    Write-Host "---"
}

ユーザー管理の自動化

# 複数のユーザーアカウントを一括作成(例)
$users = @(
    @{Name="user01"; FullName="田中太郎"; Department="営業部"},
    @{Name="user02"; FullName="佐藤花子"; Department="総務部"},
    @{Name="user03"; FullName="山田次郎"; Department="開発部"}
)

foreach ($user in $users) {
    Write-Host "ユーザー作成: $($user.Name)"
    Write-Host "  氏名: $($user.FullName)"
    Write-Host "  部署: $($user.Department)"
    
    # 実際のユーザー作成コマンドはここに書く
    # New-LocalUser -Name $user.Name -FullName $user.FullName
}

エラーハンドリングとベストプラクティス

Try-Catch文でエラー処理

$servers = @("存在しないサーバー", "google.com", "localhost")

foreach ($server in $servers) {
    try {
        $result = Test-Connection $server -Count 1 -ErrorAction Stop
        Write-Host "✓ $server への接続成功" -ForegroundColor Green
    }
    catch {
        Write-Host "✗ $server への接続でエラー: $($_.Exception.Message)" -ForegroundColor Red
    }
}

進行状況の表示

$items = @(1..100)  # 1から100までの配列
$total = $items.Count

for ($i = 0; $i -lt $total; $i++) {
    $progress = [math]::Round(($i / $total) * 100, 1)
    Write-Progress -Activity "処理中" -Status "$progress% 完了" -PercentComplete $progress
    
    # 実際の処理(例:1秒待機)
    Start-Sleep -Milliseconds 100
}

Write-Progress -Activity "処理中" -Completed
Write-Host "処理が完了しました!"

パフォーマンスの最適化

# 効率的な配列操作
$largeArray = 1..10000

# 悪い例:配列に一つずつ追加(遅い)
$result1 = @()
foreach ($item in $largeArray) {
    $result1 += $item * 2
}

# 良い例:ArrayList を使用(速い)
$result2 = New-Object System.Collections.ArrayList
foreach ($item in $largeArray) {
    $null = $result2.Add($item * 2)
}

# さらに良い例:パイプラインを使用(最速)
$result3 = $largeArray | ForEach-Object { $_ * 2 }

高度な配列操作

多次元配列の処理

# 2次元配列の作成
$matrix = @(
    @(1, 2, 3),
    @(4, 5, 6),
    @(7, 8, 9)
)

# 2次元配列のループ処理
for ($i = 0; $i -lt $matrix.Count; $i++) {
    for ($j = 0; $j -lt $matrix[$i].Count; $j++) {
        Write-Host "[$i][$j] = $($matrix[$i][$j])"
    }
}

ハッシュテーブルの配列

# オブジェクトの配列
$employees = @(
    @{Name="田中"; Age=30; Department="営業"},
    @{Name="佐藤"; Age=25; Department="開発"},
    @{Name="山田"; Age=35; Department="総務"}
)

foreach ($employee in $employees) {
    Write-Host "$($employee.Name)さん ($($employee.Age)歳) - $($employee.Department)部"
}

# 条件に合う要素のみを処理
$employees | Where-Object { $_.Age -ge 30 } | ForEach-Object {
    Write-Host "$($_.Name)さんは30歳以上です"
}

カスタムオブジェクトの配列

# PSCustomObject を使った配列
$products = @()
$products += [PSCustomObject]@{Name="商品A"; Price=1000; Stock=50}
$products += [PSCustomObject]@{Name="商品B"; Price=2000; Stock=30}
$products += [PSCustomObject]@{Name="商品C"; Price=1500; Stock=20}

# プロパティでソートして処理
$products | Sort-Object Price | ForEach-Object {
    Write-Host "$($_.Name): ¥$($_.Price) (在庫: $($_.Stock)個)"
}

デバッグとトラブルシューティング

デバッグ情報の出力

$items = @("A", "B", "C")

foreach ($item in $items) {
    Write-Debug "現在の項目: $item"  # -Debug パラメータで表示
    Write-Verbose "処理中: $item"    # -Verbose パラメータで表示
    Write-Host "結果: $item"
}

よくあるエラーとその対処法

エラー1:配列が空の場合

# 安全な配列処理
$items = @()  # 空の配列

if ($items.Count -gt 0) {
    foreach ($item in $items) {
        Write-Host $item
    }
} else {
    Write-Host "配列が空です"
}

エラー2:存在しないインデックスへのアクセス

$colors = @("Red", "Green", "Blue")

# 安全なインデックスアクセス
$index = 5
if ($index -lt $colors.Count) {
    Write-Host $colors[$index]
} else {
    Write-Host "インデックス $index は範囲外です(最大: $($colors.Count - 1))"
}

まとめ

PowerShellの配列とループ処理を覚えると、以下のようなことが簡単にできるようになります:

できるようになること

基本操作:

  • 複数の値を一括で管理・処理
  • 同じコマンドを多数の対象に自動で実行
  • データの効率的な処理と変換

実用的な応用:

  • サーバー監視の自動化
  • ファイル処理の一括実行
  • ユーザー管理の効率化
  • ログ分析の自動化

コメント

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