执行每个管道命令后,在C#中捕获PowerShell输出
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了执行每个管道命令后,在C#中捕获PowerShell输出,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2529字,纯文字阅读大概需要4分钟。
内容图文
![执行每个管道命令后,在C#中捕获PowerShell输出](/upload/InfoBanner/zyjiaocheng/965/54fb710d7fa34608bab741bf4a79de4d.jpg)
我正在实现一个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:
one rrorOccurred(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#代码转移到我的脚本中并且有效.所以现在我将所有键和值一次作为数组参数传递,并且只在管道中有一个命令.
不过,我仍然有兴趣知道是否可以在执行管道中的每个命令后生成输出.
内容总结
以上是互联网集市为您收集整理的执行每个管道命令后,在C#中捕获PowerShell输出全部内容,希望文章能够帮你解决执行每个管道命令后,在C#中捕获PowerShell输出所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。