知識マップ: C#(CSharp)でPowerShellを実行して、オブジェクトとして受け取る方法

記事「C#(CSharp)でPowerShellを実行して、オブジェクトとして受け取る方法」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

C#からPowerShellを呼ぶ場合、外部プロセスを起動し標準出力を文字列で読む方法は表示形式に依存し壊れやすいのに対し、PowerShell SDKを使うと結果をPSObjectのコレクションとして受け取れ、BaseObjectで元の.NETオブジェクトを、Propertiesで列名を指定した値を取り出せる。C#に渡すならFormat-Tableではなく、Select-Objectや[pscustomobject]で列を整えるべきで、ユーザー入力はAddScriptへ文字列連結せずAddCommand/AddParameterでパラメーター値として渡しコード注入を避ける。画面アプリではInvokeAsyncで非同期実行しつつ、CancellationTokenの登録はパイプライン起動より後に行わないと停止要求が空振りする。実行中の同一インスタンスへの再Invokeは例外になるため、並行実行にはRunspacePoolを使う。

C#からPowerShellをPSObjectとして実行する知識マップPowerShell SDKを使うとPowerShellの実行結果を文字列ではなくPSObjectとして受け取れること、BaseObjectとPropertiesの使い分け、AddParameterによるコード注入の回避、Select-ObjectとFormat-Tableの使い分け、InvokeAsyncでのキャンセルとRunspacePoolによる並行実行の要点を示す図利用する利用する利用する利用する利用する用いるのは非推奨推奨される対応推奨される対応推奨される対応原因になり得る防止する利用する両立しない利用する利用する利用する原因になり得る推奨される対応用いるのは非推奨で構成できる用いるのは非推奨推奨される対応利用する利用する原因になり得る防止するPowerShell SDK(System.Management.Automation.PowerShell)PSObjectAddCommand/AddParameterAddScriptC#側で結果を加工する処理PSObject.BaseObjectPSObject.PropertiesFormat-Table/Format-ListSelect-Object[pscustomobject]PowerShellへユーザー入力を渡す要件スクリプト注入リスクPowerShell.InvokeAsyncWindows PowerShell 5.1BeginInvoke/EndInvoke.NET Frameworkパイプライン停止API(Stop/BeginStop/EndStop)PipelineStoppedExceptionRunspacePool複数のPowerShell処理を並行実行したい要件ErrorAction Stop外部プロセスとしてのPowerShell起動CancellationTokenでパイプラインを安全に止める実装パターンCancellationToken(.NET)パイプライン起動より前のキャンセル登録登録と起動の間のキャンセル空振り

概念間の関係(全26件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

PowerShell SDK(System.Management.Automation.PowerShell)
PowerShellのパイプラインをホストアプリ(C#など)のコードから組み立てて実行できる.NETのクラスで、実行結果を文字列ではなくPSObjectのコレクションとして受け取れる。
PSObject
PowerShellが出力する値を包むラッパーオブジェクトで、元の.NETオブジェクト(BaseObject)とプロパティの集合(Properties)を保持する。
C#側で結果を加工する処理
PowerShellの実行結果をC#側でプロパティや型として扱い、画面表示や業務ロジックに使う処理。
Format-Table/Format-List
PowerShellの結果を画面表示用に整形するコマンドレットで、通すと結果が元のオブジェクトではなく表示用のフォーマット情報に変わる。
Select-Object
PowerShellのパイプラインで必要な列だけに絞り込むコマンドレットで、結果はオブジェクトのまま後続処理に渡せる。
[pscustomobject]
PowerShellスクリプト側で複数の値を名前付きのプロパティとしてまとめて返すための構文。
AddCommand/AddParameter
PowerShellオブジェクトにコマンド名とパラメーターを順に追加してパイプラインを組み立てる、PowerShell SDKのメソッド群。渡した値はコード文字列としてではなくパラメーター値として扱われる。
AddScript
PowerShellのスクリプト文字列をそのままパイプラインに追加して実行する、PowerShell SDKのメソッド。
Windows PowerShell 5.1
Windowsに標準で同梱されている、.NET Framework上に構築されたレガシー世代のPowerShell(5.1系)のランタイム。実行ファイルはpowershell.exeで、.NETアプリからはMicrosoft.PowerShell.5.1.ReferenceAssembliesを介して呼び出せる。
.NET Framework
Windowsのコンポーネントとして扱われ、インストールされているOSのライフサイクルに沿ってサポートされるランタイム。System.Messagingの対象範囲。
パイプライン停止API(Stop/BeginStop/EndStop)
実行中のPowerShellパイプラインを止めるためのAPI群。同期のStopは停止し終わるまで戻らず、非同期のBeginStop/EndStopはUIスレッドを待たせずに停止を要求できる。
RunspacePool
複数のPowerShellインスタンスから使い回せる実行空間(Runspace)のプールで、並行実行の際にRunspaceの都度生成コストを避けられる。
外部プロセスとしてのPowerShell起動
ProcessStartInfoでpowershell.exe/pwsh.exeを外部プロセスとして起動し、標準出力・標準エラーを文字列として読み取る方法。
CancellationTokenでパイプラインを安全に止める実装パターン
パイプラインを起動した後にCancellationToken.Registerで停止(BeginStop/EndStop)を仕込み、停止の完了を待ってからPowerShellインスタンスを破棄する実装パターン。
パイプライン起動より前のキャンセル登録
CancellationToken.Registerによる停止コールバックの登録を、InvokeAsync等でパイプラインを起動するより前に行ってしまう実装。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。