0

このサンプルに従って - http://msdn.microsoft.com/en-us/library/windows/desktop/ee706590(v=vs.85).aspx

スクリプトを非同期で呼び出そうとしています。しかし、同時に、発生している一連の操作について GUI にフィードバックを提供したいと考えています。

これを達成するのに混乱しています - PipelineReader オブジェクトにDataReadyイベントがあるのでしょうか? GUIでフィードバックを表示できるように、上記のMSDNサンプルをどうにかして消費することは可能ですか?

概念的には、このサンプルDataReadyイベントに関連付けることはできません。

4

2 に答える 2

2

とった !これが完全なコードです...

最初にフォームにRich Textbox = txtOutputを追加し、参照を追加し ます

C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll

    IAsyncResult _invokeResult; 

    PowerShell _ps = PowerShell.Create();

    delegate void SetOutput(string value);

    // Monitor the DataAdded
    _ps.Streams.Verbose.DataAdded += new EventHandler<DataAddedEventArgs>(Verbose_DataAdded);

    var sr = new StreamReader(@"C:\MyScript.ps1");
    _ps.AddScript(sr.ReadToEnd());
    _invokeResult = _ps.BeginInvoke<PSObject>(null, null, AsyncInvoke, null);


   void Verbose_DataAdded(object sender, DataAddedEventArgs e)
   {
       System.Diagnostics.Debug.Print( ((PSDataCollection<VerboseRecord>) sender)[e.Index].ToString()) ;

       if (txtOutput.InvokeRequired)
       {
           string msg = ((PSDataCollection<VerboseRecord>) sender)[e.Index].ToString();
           txtOutput.Invoke(new SetOutput(Execute), new object[] { msg} );
       }
   }



   void AsyncInvoke(IAsyncResult ar)
   {
       // end
       try
       {
           _ps.EndInvoke(ar);
       }
       catch (Exception ex)
       {
             // do something with the error...
       }
  }

private void Execute(string msg)
        {
            txtOutput.SelectionFont = new Font(txtOutput.SelectionFont.FontFamily, 9.0f);
            txtOutput.AppendText(msg);
            txtOutput.ScrollToCaret();
        }
于 2012-05-24T15:57:29.227 に答える
1

Write-Verbose 出力のみを GUI に出力する場合は、 InvokeAsync の後でStreams.Verboseコレクションを監視する方が簡単です。すべての出力をスキャンする場合は、PipelineReader を使用します。その DataReady イベントをサブスクライブし、そのイベント ハンドラーで NonBlockingRead を実行してデータを取得します。

于 2012-05-23T18:37:56.603 に答える