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

本文关键字:管道 显示 结果 调用 异步 Powershell | 更新日期: 2023-09-27 18:35:11

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

我正在尝试以异步方式调用我的脚本。但是,与此同时,我想向 GUI 提供有关发生的操作集的反馈,即想要吐出在 GUI 上并行的幕后发生的 Write 详细内容。

我对实现这一点感到困惑 - 因为我看到管道阅读器对象上有一个 DataReady 事件?是否可以以某种方式使用上面的 MSDN 示例,以便我可以在 GUI 上显示反馈?

从概念上讲,我无法将此示例DataReady 事件相关联。

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

明白了!这是完整的代码...

首先在窗体上添加格式文本框 = txt输出添加对

C:''程序文件 (x86)''参考 程序集''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();
        }

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