2012-10-15 14 views
12

Sto usando System.Management.Automation.Runspaces per eseguire gli script di PowerShell. c'è un'opzione in grado di leggere il codice di uscita di un determinato script?Come leggere il codice di uscita di PowerShell tramite 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; 
     } 
    } 
} 

risposta

5

comandi PowerShell hanno un meccanismo di errore più ricco di codici di uscita interi. C'è un flusso di errori in cui appaiono errori non terminanti. Gli errori di terminazione comportano eccezioni generate, quindi è necessario gestirle. Il codice seguente mostra come utilizzare i due meccanismi:

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

Se si esegue questo programma uscite:

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

E 'semplice come chiedere il valore per la spazio di esecuzione appena creato:

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