![](/img/trans.png)
[英]Capturing Powershell output in C# after Pipeline.Invoke throws
[英]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.