Sto usando System.Management.Automation
DLL che mi permette di chiamare PowerShell all'interno della mia C# applicazione in questo modo:Calling PowerShell da C#
PowerShell.Create().AddScript("Get-Process").Invoke();
Quello che sto cercando di fare è chiamare PowerShell, ma fornire la lista di input. Per esempio, in:
1, 2, 3 | ForEach-Object { $_ * 2 }
Sto cercando di fornire il lato sinistro 1, 2, 3
quando si richiama:
// powershell is a PowerShell Object
powershell.Invoke(new [] { 1, 2, 3 });
Tuttavia questo non funziona. Il soluzione mi è venuta stava usando ForEach-Object
e poi passando la matrice come InputObject
con la { $_ }
come 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();
Sebbene il codice precedente funziona esiste un modo di usare Invoke
passando l'ingresso array perché avrei pensato che questo sarebbe un modo desiderabile di chiamarlo?
Funziona ma passi '1,2,3' come una stringa piuttosto che una matrice i.e.' new int [] {1,2,3} '. Il secondo è necessario se devo passare i dati strutturati alla pipeline. –
@TahirHassan L'unico modo che conosco per passare .net oggetto creato sta usando 'SessionStateProxy.SetVariable (nome stringa, valore oggetto)'. Guarda la mia risposta modificata. –
Hai risposto alla mia domanda su come avviare la pipeline con un array (senza passarlo a 'ForEach-Object' usando il parametro' InputObject' come descritto nella mia domanda). Grazie. –