【问题标题】:How to read errors from Powershell pipeline in c#?如何从 C# 中的 Powershell 管道读取错误?
【发布时间】:2018-08-02 07:09:35
【问题描述】:

我正在使用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,但它只会在检测到错误时将我拉到循环中,它会做任何事情来获取错误消息。我的问题是如何在控制台屏幕上获取实际错误?

【问题讨论】:

    标签: c# .net powershell system.management


    【解决方案1】:

    这样的事情应该会给你带来错误。

    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();
    }
    

    【讨论】:

      【解决方案2】:

      随着最近的更改,以下适用于 C# 中的 Microsoft.powershell.5.referenceAssemblies

      var result = ps.Invoke();
      
      if (ps.HadErrors)
      {
          foreach (ErrorRecord error in ps.Streams.Error.ReadAll())
          {
              Console.WriteLine(error.ToString());
              // You can access error.FullyQualifiedErrorId or error.Exception if you needed to 
              //   be specific in what you were looking for when it failed.
          }
      }
      

      【讨论】:

        【解决方案3】:

        要查看错误,您可以查看集合 PowerShell.Streams.Error

        如果您想在 PowerShell 脚本中本地执行此操作并返回错误,您可以将其包装在 try/catch 中并返回 $error 变量。

        $error 是一个 PowerShell 变量,其中所有错误都会自动添加到数组中。数组中的第一项总是最新的错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-08
          • 1970-01-01
          • 2020-07-18
          • 1970-01-01
          • 2019-12-30
          • 2021-12-11
          • 1970-01-01
          • 2023-03-30
          相关资源
          最近更新 更多