2012-10-15 6 views
12

Ich verwende System.Management.Automation.Runspaces, um PowerShell-Skripte auszuführen. Gibt es eine Option ich kann den Exit-Code eines bestimmten Skripts lesen?So lesen Sie den PowerShell-Exit-Code über C#

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

Antwort

5

Power Befehle haben einen reicheren Fehlermechanismus als integer Beendigungscodes. Es gibt einen Fehlerstream, bei dem nicht terminierende Fehler auftreten. Terminierungsfehler führen zu ausgelösten Ausnahmen, so dass Sie diese behandeln müssen. Der folgende Code zeigt, wie die beiden Mechanismen verwenden:

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

Wenn Sie dieses Programm ausführen es gibt:

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 . . . 
0

Es ist so einfach, wie Sie den Wert auf dem Runspace fragen Sie gerade erstellt haben:

s_ps.AddScript("$LASTEXITCODE"); 
results = s_ps.Invoke(); 
int.TryParse(results[0].ToString(),out valorSortida); 
Verwandte Themen