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?
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. –
@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. –
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. –