2012-11-06 13 views
5

ich System.Management.Automation DLL verwende, die mir wie so Powershell in meinem C# .NET-Anwendung aufrufen können:Powershell aufrufen Von C#

PowerShell.Create().AddScript("Get-Process").Invoke(); 

Liste Was ich versuche zu tun ist, rufen Sie Powershell, sondern liefern die Eingabe. Zum Beispiel in:

1, 2, 3 | ForEach-Object { $_ * 2 } 

Ich versuche, die linke Seite 1, 2, 3 zu liefern, wenn Aufruf:

// powershell is a PowerShell Object 
powershell.Invoke(new [] { 1, 2, 3 }); 

aber das funktioniert nicht. Die Behelfslösung kam ich mit wurde ForEach-Object und anschließend Leiten des Array als InputObject mit der { $_ } als Process:

// create powershell object 
var powershell = PowerShell.Create(); 

// input array 1, 2, 3 
Command inputCmd = new Command("ForEach-Object"); 
inputCmd.Parameters.Add("InputObject", new [] { 1, 2, 3 }); 
inputCmd.Parameters.Add("Process", ScriptBlock.Create("$_")); 
powershell.Commands.AddCommand(inputCmd); 

// ForEach-Object { $_ * 2 } 
Command outputCmd = new Command("ForEach-Object"); 
outputCmd.Parameters.Add("Process", ScriptBlock.Create("$_ * 2")); 
powershell.Commands.AddCommand(outputCmd); 

// invoke 
var result = powershell.Invoke(); 

Obwohl die oben arbeitet Code ist es eine Möglichkeit, Invoke der Verwendung in dem Eingangs Passieren Array, weil ich hätte, dass dies wünschenswert wäre, es zu nennen?

Antwort

8

Ein wenig spät, aber:

    PowerShell ps = PowerShell.Create(); 
    ps.Runspace.SessionStateProxy.SetVariable("a", new int[] { 1, 2, 3 }); 
    ps.AddScript("$a"); 
    ps.AddCommand("foreach-object"); 
    ps.AddParameter("process", ScriptBlock.Create("$_ * 2")); 
    Collection<PSObject> result = ps.Invoke(); 
    foreach (PSObject result in results) 
       { 
        Console.WriteLine(result); 
       } 

kehrt exactely:

2 
4 
6 
+0

Dies funktioniert, aber Sie übergeben '1,2,3' als String und nicht als Array, d. H.' New int [] {1,2,3} '. Der zweite wird benötigt, um strukturierte Daten an die Pipeline zu übergeben. –

+0

@TahirHassan Die einzige Methode, die ich kenne, um das .net-Objekt zu übergeben, ist die Verwendung von 'SessionStateProxy.SetVariable (String-Name, Objektwert)'. Schau dir meine bearbeitete Antwort an. –

+0

Sie haben meine Frage beantwortet, wie man die Pipeline mit einem Array startet (ohne es mit dem Parameter 'InputObject' an' ForEach-Object' zu übergeben, wie in meiner Frage beschrieben). Vielen Dank. –

2

Ich habe meine Forschung getan und PowerShell.Invoke(IEnumerable) wird die InputObject des ersten Befehls in der Liste festgelegt. Anstatt InputObject auf inputCmd oben zu setzen, können wir stattdessen die Methode Invoke verwenden. Wir benötigen weiterhin den ersten ForEach-Object Aufruf, um das Eingabearray an zu übergeben.

+0

Geben Sie einen Versuch, um meine Antwort. –

+0

Das ist Genie! Ich würde dort nie danach suchen! – t3chb0t

Verwandte Themen