c# - 如何从 C# 中的 Powershell 管道读取错误?

标签 c# .net powershell system.management

我正在使用 System.Management.Automation.Runspaces.Pipleline 创建一个 powershell 管道实例并在 c# 控制台应用程序中执行我的 powershell 脚本,问题是如果脚本以错误结束,那么我不知道如何在控制台屏幕上打印该错误。

这是我的代码,

System.Management.Automation.Runspaces.Runspace PowershellRunspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace();
PowershellRunspace.Open();

System.Management.Automation.RunspacesPipeline PowershellPipeline = PowershellRunspace.CreatePipeline();
PowershellPipeline.Commands.AddScript(PowershellScript);
PowershellPipeline.Commands.AddScript("Out-String");
foreach (string IpAddress in ActiveSystemIPAddresses)
{

    PowershellPipeline.Commands.AddScript("Stop-Computer -ComputerName \"" + IpAddress + "\" -Credential $Credentials");
}
try
{
    Collection<PSObject> output = PowershellPipeline.Invoke();
    if (PowershellPipeline.HadErrors)
    {
        Console.WriteLine("Cannot shutdown this server IP");
    }
    PowershellPipeline.Stop();

    StringBuilder results = new StringBuilder();

    foreach (PSObject obj in output)
    {
        results.AppendLine(obj.ToString());
    }
    Console.WriteLine(results);
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}
PowershellRunspace.Close();

我可以看到属性 Pipeline.HadErrors 但它只会在检测到错误时让我进入循环,它会做任何事情来获取错误消息。我的问题是如何在控制台屏幕上获取实际错误?

最佳答案

这样的事情应该会让你出错。

var rs = RunspaceFactory.CreateRunspace();
rs.Open();
var ps = rs.CreatePipeline();
ps.Commands.AddScript("Get-Member");
ps.Commands.AddScript("ps");

try
{
    var result = ps.Invoke();

    if (ps.HadErrors)
    {
        var errors = ps.Error.ReadToEnd();
        foreach (var error in errors)
        {
            Console.WriteLine(error);
        }
    }

    foreach (var r in result)
    {
        Console.WriteLine(r);
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}
finally
{
    ps.Stop();
}

关于c# - 如何从 C# 中的 Powershell 管道读取错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51647538/

相关文章:

c# - 获取 DialogStack 上的当前 Dialog

arrays - 在PowerShell中返回具有单个元素的数组

c# - 获取第二个不同类型列表中缺少的元素

.net - 缺少自定义属性时选择正确的异常类型

PowerShell 错误?无法通过管道将 ComputerName 属性传递给 Get-Service(按值和按属性名称混合)

xml - 使用 Powershell 转义 XML 元素名称中的破折号

c# - Path.Combine 是否曾在 .net 中进行过网络调用?

c# - XML 解析器从 Word 文件中读取 xml 标签 C#

c# - 正则表达式 c# 属性到 typescript 字段

c# - 事件是 OO 等同于 GOTO 吗?