2013-05-02 9 views
9

私のアプリケーションではかなり限られたPowerShellサポートを追加しようとしています。ユーザー定義のPowerShellスクリプトを定期的に実行し、進行通知とユーザー・プロンプト要求を処理できるようにします。 I は、コマンドラインスタイルの対話式サポートが必要です。または、リモートスクリプトや複数の同時スクリプトを実行する機能が必要です。私は最終的にスクリプトを非同期に実行するか、バックグラウンドスレッドで実行したいと思うでしょう。おそらくシェルにいくつかの初期変数をつけてかもしれません。おそらくコマンドレットですが、この機能はおそらく得意です。Hosting PowerShell:PowerShellとRunspaceとRunspacePoolとパイプラインとの比較

私はMSDN documentation about writing host application codeを読んでてきたが、それは喜んPowerShellオブジェクト、またはRunspace、またはRunspacePool、またはPipelineを作成する方法をを説明しながら、 1が終わっこれらのアプローチのいずれかを選ぶだろうについてなぜ兆候はありません別の

私はが、私はこれらの2の1までだけど、私はアプローチが取るよりよい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! */); 

(要求された由来のクラスメソッドの1つがEnterNestedPrompt()であり、私が実行するユーザー定義スクリプトが呼び出されるかどうかはわかりません。できる場合は、 "開始新しいネストされた入力loo p "(as per here)...これが上に向かう経路に影響する場合は、それも知っておくと良いでしょう)

ありがとう!

+2

実際にはホストは必要ありません。 Write-Host、Read-Hostなどの呼び出しを避けるようにしてください。PSにホストが接続されているかどうかを確認する方法はありますが、現時点ではそれを思い出しません。 –

+0

私はPSHostを_need_していないかもしれませんが、私の場合、私はそれを望んでいます...私は、ユーザ定義のスクリプトが私が見せたい時々の診断メッセージを持つことを期待しています。 (元の投稿を編集して、それをより明確にします) – JaredReisinger

答えて

1

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

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

また、PowerShellオブジェクトには作成時にRunspaceがありますが、それを与える必要はありません。環境を維持するためにRunspaceを保持する必要がある場合は、PowerShellオブジェクト全体を保持し、Invokeを呼び出した後に毎回コマンドとすべてのStreamをクリアしてください。

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

+0

ねえ! 「PowerShellオブジェクト全体を保持し、Invokeを呼び出した後に毎回コマンドとすべてのストリームをクリアする」方法を拡張できますか?私は現在のところ、ランスペースを使用していないので、このような理由でそれらを実装しようとしていましたが、PowerShellメソッドを使用してこれを実現できますか?ありがとう!! –

+0

適切な質問をしてください。コメントに質問に答えるポイントはありません。 ;) – Serjx86

関連する問題