簡體   English   中英

執行每個管道命令后,在C#中捕獲PowerShell輸出

[英]Capturing PowerShell output in C# after execution of each pipeline command

我正在實現一個WPF應用程序,該應用程序為字典中給出的每個鍵/值對執行PowerShell腳本,使用該對作為腳本參數。 我將腳本的每次運行存儲為管道中的新命令。 但是,這導致我只能從運行的最后一個命令返回輸出,當我在每次運行腳本后需要輸出時。 我每次執行腳本時都考慮過創建一個新的管道,但我需要知道腳本的所有執行何時完成。 這是幫助解釋我的問題的相關代碼:

private void executePowerShellScript(String scriptText, Dictionary<String, String> args)
{
     // Create the PowerShell object.
     PowerShell powerShell = PowerShell.Create();

     // If arguments were given, add the script and its arguments.
     if (args != null)
     {
          foreach (KeyValuePair<String, String> arg in args)
          {
               powerShell.AddScript(scriptText);
               powerShell.AddArgument(arg.Key);
               powerShell.AddArgument(arg.Value);
          }
     }

     // Otherwise, just add the script.
     else
          powerShell.AddScript(scriptText);

     // Add the event handlers.
     PSDataCollection<PSObject> output = new PSDataCollection<PSObject>();
     output.DataAdded += new EventHandler<DataAddedEventArgs>(Output_DataAdded);
     powerShell.InvocationStateChanged +=
          new EventHandler<PSInvocationStateChangedEventArgs>(Powershell_InvocationStateChanged);

     // Invoke the pipeline asynchronously.
     IAsyncResult asyncResult = powerShell.BeginInvoke<PSObject, PSObject>(null, output);
}

private void Output_DataAdded(object sender, DataAddedEventArgs e)
{
     PSDataCollection<PSObject> myp = (PSDataCollection<PSObject>)sender;

     Collection<PSObject> results = myp.ReadAll();
     foreach (PSObject result in results)
     {
          Console.WriteLine(result.ToString());
     }
}

然后我使用以下方法來了解腳本的所有執行何時完成。 由於我通過檢查管道的調用狀態是否已完成來執行此操作,因此無法為每次執行腳本創建新管道:

private void Powershell_InvocationStateChanged(object sender, PSInvocationStateChangedEventArgs e)
{
     switch (e.InvocationStateInfo.State)
     {
          case PSInvocationState.Completed:
               ActiveCommand.OnCommandSucceeded(new EventArgs());
               break;
          case PSInvocationState.Failed:
               OnErrorOccurred(new ErrorEventArgs((sender as PowerShell).Streams.Error.ReadAll()));
               break;
     }
     Console.WriteLine("PowerShell object state changed: state: {0}\n", e.InvocationStateInfo.State);
}

那么,來回答我的問題:

1)在執行每個命令后,我可以強制管道產生輸出嗎? 要么,
2)如果我每次運行命令時都要創建一個新管道,還有另一種方法可以檢查腳本的所有執行是否都已完成?

在C#中使用實際的PowerShell類的例子很少,我對線程幾乎一無所知,所以任何幫助都會非常感激。

我對回答我自己的問題感到愚蠢,但我所做的就是將循環功能從我的C#代碼轉移到我的腳本中並且有效。 所以現在我將所有鍵和值一次作為數組參數傳遞,並且只在管道中有一個命令。

不過,我仍然有興趣知道是否可以在執行管道中的每個命令后生成輸出。

我有一種情況,我有一個管理PowerShell環境的對象,它需要一個腳本或模塊和cmdlet並執行它,然后從原始模塊獲取一個新的腳本或模塊和cmdlet或cmdlet並執行它。 每次執行某些操作時,我都需要返回結果。 我通過在每次執行后清除命令隊列來解決它:

powerShellInstance.Commands.Clear();

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM