Powershell / C#:异步调用管道&显示结果

时间:2012-05-23 15:33:30

标签: c# powershell powershell-v2.0

根据此示例 - http://msdn.microsoft.com/en-us/library/windows/desktop/ee706590(v=vs.85).aspx

我试图以异步方式调用我的脚本。但是,与此同时,我希望在发生的操作集上向GUI提供反馈,即希望在GUI上并行地吐出幕后发生的Write-verbose东西。

我很难实现这一点 - 因为我看到PipelineReader对象上有一个DataReady事件?是否有可能以某种方式消耗上面的 MSDN示例,以便我可以在GUI上显示反馈?

  

从概念上讲,我无法将 this sample DataReady事件联系起来。

2 个答案:

答案 0 :(得分:2)

  

知道了!这是完整的代码......

首先在表单上添加Rich Textbox = txtOutput &安培; 添加对

的引用
  

C:\ Program Files(x86)\ Reference   组件\微软\ 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();
        }

答案 1 :(得分:1)

如果您只想将Write-Verbose输出输出到GUI,那么在InvokeAsync之后监视Streams.Verbose集合会更容易。如果要扫描所有输出,请使用PipelineReader。订阅其DataReady事件,并在该事件处理程序中执行NonBlockingRead以获取数据。