「複数のデータを一括で処理したい」
「同じコマンドを色々な値に繰り返したい」
そんなときに便利なのが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の配列とループ処理を覚えると、以下のようなことが簡単にできるようになります:
できるようになること
基本操作:
- 複数の値を一括で管理・処理
- 同じコマンドを多数の対象に自動で実行
- データの効率的な処理と変換
実用的な応用:
- サーバー監視の自動化
- ファイル処理の一括実行
- ユーザー管理の効率化
- ログ分析の自動化
コメント