この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。PowerShell 7の並列実行とクラスのRunspace挙動をMicrosoft公式資料で確認し、旧記事の性能値とクラス共有に関する危うい前提を修正しました。検証ステータス:✅ PowerShell公式仕様確認済み
PowerShellのclassは、IT資産情報の項目名や型を揃える用途に向いています。ただし、ForEach-Object -Parallelと組み合わせる場合は、クラス定義やインスタンスをRunspace間でどう扱うかを意識する必要があります。
まず「型を揃える」用途に使う
class AssetResult {
[string]$ComputerName
[bool]$Reachable
[datetime]$CheckedAt
AssetResult([string]$name, [bool]$ok) {
$this.ComputerName = $name
$this.Reachable = $ok
$this.CheckedAt = Get-Date
}
}
大規模スクリプトでは、プロパティ名の揺れを防げる点が利点です。一方、単純な棚卸しならPSCustomObjectの方が読みやすいこともあります。
Parallel内部では単純なデータを返す方が安全
ForEach-Object -ParallelはPowerShell 7.0で導入され、別Runspaceでスクリプトブロックを実行します。クラスにはRunspace affinityの考慮もあるため、親側で作った複雑なオブジェクトへ並列側から直接メソッドを呼ぶ設計より、並列側では単純な値を取得し、集約後に型へ変換する方が分かりやすくなります。
$raw = $ComputerName | ForEach-Object -Parallel {
[pscustomobject]@{
ComputerName = $_
Reachable = Test-Connection $_ -Count 1 -Quiet -ErrorAction SilentlyContinue
}
} -ThrottleLimit 5
$results = foreach ($r in $raw) {
[AssetResult]::new($r.ComputerName, [bool]$r.Reachable)
}
ThrottleLimitは実測で決める
既定値は5です。50や100へ上げれば必ず速くなるわけではありません。接続先、DNS、ネットワーク、CPU、タイムアウトの影響を受けるため、少数から測定して調整します。
公式情報
この記事の更新履歴
- 2026-09-14 追加:Runspace境界を避けるため、並列側は単純データを返して後からクラス化する例を追加。
- 2026-09-14 変更:クラス化を高速化手段ではなく、データ構造の統一手段として再整理。
- 2026-09-14 削除:内部メタ情報、本文H1、5〜10倍高速化など未計測の性能値を削除。

