18

アプリケーションにかなり制限された PowerShell サポートを追加しようとしています。ユーザー定義の PowerShell スクリプトを定期的に実行して出力を表示し、(最終的には) 進行状況の通知とユーザー プロンプトの要求を処理できるようにしたいと考えています。私がホストするシェル内からユーザースクリプトがそれ自体を実行しない限り、コマンドラインスタイルのインタラクティブなサポート、または(私が思うに)リモートアクセスまたは複数の同時スクリプトを実行する機能は必要ありません。最終的には、スクリプトを非同期またはバックグラウンド スレッドで実行し、シェルにいくつかの初期変数とコマンドレットをシードする可能性がありますが、それはこの機能が得られる可能性が高いのと同じくらい「派手」です。

ホスト アプリケーション コードの記述に関する MSDNのドキュメントを読んでいますが、オブジェクト、、、、、、またはを作成する方法は喜んで説明されていますが、これらのアプローチのいずれかを選択する理由については示されていません。PowerShellRunspaceRunspacePoolPipeline

私はこれら 2 つのうちの 1 つにかかっていると思いますが、どちらのアプローチを取るのが良いかについてのフィードバックが欲しいです:

PowerShell shell = PowerShell.Create();
shell.AddCommand(/* set initial state here? */);
shell.AddStatement();
shell.AddScript(myScript);
shell.Invoke(/* can set host! */);

また:

Runspace runspace = RunspaceFactory.CreateRunspace(/* can set host and initial state! */);
PowerShell shell = PowerShell.Create();
shell.Runspace = runspace;
shell.AddScript(myScript);
shell.Invoke(/* can set host here, too! */);

(必須のPSHost派生クラス メソッドの 1 つは ですEnterNestedPrompt()。私が実行するユーザー定義スクリプトによってそれが呼び出される可能性があるかどうかはわかりません。可能であれば、「新しいネストされたメソッドを開始する責任があります。入力ループ」(ここのように)...それが上記のパスに影響する場合は、それも知っておくとよいでしょう。)

ありがとう!

4

2 に答える 2

0

あなたはそれを考えすぎています。サンプルで示したコードは良いスタートです。Invoke()あとは、エラー ストリームと警告ストリームの結果を読み取って確認するだけです。

PowerShell ホストは、RunSpace がユーザーと通信するために使用できるいくつかのフックを提供します。たとえば、出力のストリームとフォーマット、進行状況の表示、エラーの報告などです。実行したいことには、PowerShell ホストは必要ありません。アプリケーションの機能を使用して、PowerShell クラスを使用してスクリプト実行から結果を読み取り、エラー、警告をチェックし、出力ストリームを読み取り、ユーザーに通知を表示できます。これは、PowerShell ホスト全体を記述してエラーが検出された場合にメッセージ ボックスを表示するよりも、はるかに簡単で効果的です。

また、PowerShell オブジェクトは作成時に実行空間を持っているため、指定する必要はありません。環境を維持するために実行空間を保持する必要がある場合は、PowerShell オブジェクト全体を保持し、Invoke を呼び出すたびにコマンドとすべてのストリームをクリアします。

次の質問は、 の結果を処理してPowerShell::Invoke()を読み取る方法PowerShell::Streamsです。

于 2014-01-10T20:24:50.270 に答える