如何从 C# 中的 Powershell 管道读取错误?
How to read errors from Powershell pipeline in c#?
我正在使用 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();
}
要查看错误可以查看集合PowerShell.Streams.Error
。
如果您想在 PowerShell 脚本中本地执行此操作并且 return 您可以将其包装在 try/catch 和 return $error 变量中。
$error 是一个 PowerShell 变量,其中所有错误都会自动添加到一个数组中。数组中的第一项始终是最新的错误。
随着最近的变化,以下与 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.
}
}
我正在使用 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();
}
要查看错误可以查看集合PowerShell.Streams.Error
。
如果您想在 PowerShell 脚本中本地执行此操作并且 return 您可以将其包装在 try/catch 和 return $error 变量中。
$error 是一个 PowerShell 变量,其中所有错误都会自动添加到一个数组中。数组中的第一项始终是最新的错误。
随着最近的变化,以下与 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.
}
}