PowerShellクラスで診断結果を型付けする ― 並列処理とRunspace affinityの注意点

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

この記事について
この記事は、生成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%以上削減など未検証の性能値を削除。

文書情報

記事タイトル
PowerShellクラスで診断結果を型付けする ― 並列処理とRunspace affinityの注意点
作成日
更新日
Source URL
https://papanda925.com/?p=5769

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

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