この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。PowerShell公式のForEach-Object -Parallelとabout_Classesを確認し、旧記事の型安全性・高速化に関する過剰な断定を修正しました。検証ステータス:✅ PowerShell公式仕様確認済み
診断結果をPowerShellクラスで表すと、ComputerName、Status、CheckedAtなどの項目を固定できます。ただし、クラスを使うだけでメモリ効率や速度が上がるわけではありません。主な利点はデータ構造と処理意図を明示できることです。
診断結果の型を定義する
class NodeHealthReport {
[string]$ComputerName
[string]$Status
[datetime]$CheckedAt
NodeHealthReport([string]$name, [string]$status) {
$this.ComputerName = $name
$this.Status = $status
$this.CheckedAt = Get-Date
}
}
Parallel内でクラスを多用しない
ForEach-Object -Parallelは別Runspaceで動きます。PowerShellクラスにはRunspace affinityに関する挙動があり、親Runspaceのクラスやインスタンスをそのまま並列側で自由に扱えると考えるのは危険です。
実務では、並列側ではPSCustomObjectなど単純なデータを返し、集約後にクラスへ変換する方法が分かりやすくなります。
$raw = $ComputerName | ForEach-Object -Parallel {
$ok = Test-Connection $_ -Count 1 -Quiet -ErrorAction SilentlyContinue
[pscustomobject]@{
ComputerName = $_
Status = if ($ok) { 'Reachable' } else { 'Unreachable' }
}
} -ThrottleLimit 5
$report = foreach ($r in $raw) {
[NodeHealthReport]::new($r.ComputerName, $r.Status)
}
数千台だからThrottleLimit 50、ではない
同時実行数は対象台数ではなく、ネットワーク、名前解決、接続先負荷、タイムアウト、実行端末の余力を見て決めます。既定値5から実測し、失敗率と処理時間を見ながら調整します。
公式情報
この記事の更新履歴
- 2026-09-14 追加:並列側は単純データを返し、集約後にクラス化するパターンを追加。
- 2026-09-14 変更:クラスを高速化技法ではなく構造化技法として再整理。
- 2026-09-14 削除:内部執筆指示、本文H1、300秒→15秒・90%以上削減など未検証の性能値を削除。
