PowerShellクラスでIT資産管理を構造化する ― 並列処理ではRunspace境界に注意

PowerShellカテゴリを表すパンダのイラスト PowerShell

この記事について
この記事は、生成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倍高速化など未計測の性能値を削除。

文書情報

記事タイトル
PowerShellクラスでIT資産管理を構造化する ― 並列処理ではRunspace境界に注意
作成日
更新日
Source URL
https://papanda925.com/?p=5751

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

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