我正在使用System.Management.Automation.Runspaces
来执行PowerShell脚本。
有没有一个选项可以读取给定脚本的退出代码?
using System.IO;
using System.Management.Automation.Runspaces;
using System.Collections.ObjectModel;
using System.Management.Automation;
namespace PowerShell
{
public class PowerShellExecuter
{
public Collection<PSObject> RunPsScript(string psScriptFile)
{
string psScript;
if (File.Exists(psScriptFile))
{
psScript = File.ReadAllText(psScriptFile);
}
else
{
throw new FileNotFoundException("Wrong path for the script file");
}
Runspace runSpace = RunspaceFactory.CreateRunspace();
runSpace.Open();
RunspaceInvoke runSpaceInvoker = new RunspaceInvoke(runSpace);
runSpaceInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
Pipeline pipeLine = runSpace.CreatePipeline();
pipeLine.Commands.AddScript(psScript);
pipeLine.Commands.Add("Out-String");
Collection<PSObject> returnObjects = pipeLine.Invoke();
runSpace.Close();
return returnObjects;
}
}
}
答案 0 :(得分:6)
PowerShell命令比整数退出代码具有更丰富的错误机制。有一个错误流,出现非终止错误。终止错误会导致抛出异常,因此您需要处理这些异常。以下代码显示了如何使用这两种机制:
using System;
using System.Collections.ObjectModel;
using System.Management.Automation;
namespace PowerShellRunspaceErrors
{
class Program
{
private static PowerShell s_ps;
static void Main(string[] args)
{
s_ps = PowerShell.Create();
ExecuteScript(@"Get-ChildItem c:\xyzzy");
ExecuteScript("throw 'Oops, I did it again.'");
}
static void ExecuteScript(string script)
{
try
{
s_ps.AddScript(script);
Collection<PSObject> results = s_ps.Invoke();
Console.WriteLine("Output:");
foreach (var psObject in results)
{
Console.WriteLine(psObject);
}
Console.WriteLine("Non-terminating errors:");
foreach (ErrorRecord err in s_ps.Streams.Error)
{
Console.WriteLine(err.ToString());
}
}
catch (RuntimeException ex)
{
Console.WriteLine("Terminating error:");
Console.WriteLine(ex.Message);
}
}
}
}
如果您运行此程序,则输出:
Output:
Non-terminating errors:
Cannot find path 'C:\xyzzy' because it does not exist.
Terminating error:
Oops, I did it again.
Press any key to continue . . .
答案 1 :(得分:1)
进程返回退出代码,而不是PowerShell Runspaces
。
据我所知,捕获Runspace
状态的最佳方法是订阅Runspace.StateChanged
事件,这将使您RunspaceStateInfo
能够处理。 RunspaceStateInfo
上有两个有用的属性:Reason
和State
。
答案 2 :(得分:1)
就像向刚刚创建的运行空间询问值一样简单:
s_ps.AddScript("$LASTEXITCODE");
results = s_ps.Invoke();
int.TryParse(results[0].ToString(),out valorSortida);