Calling PowerShell From C#

泪湿孤枕 提交于 2019-12-17 16:31:20

问题


I am using System.Management.Automation DLL which allows me to call PowerShell within my C# application like so:

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

What I am trying to do is call PowerShell but supply the input list. For example, in:

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

I am trying to supply the left hand side 1, 2, 3 when invoking:

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

However this does not work. The workaround I came up with was using ForEach-Object and then passing the array as an InputObject with the { $_ } as the 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();

Although the above is working code is there any way of using Invoke passing in the input array because I would have though that this would be desirable way of calling it?


回答1:


A little bit late but:

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> results = ps.Invoke();
foreach (PSObject result in results)
{
    Console.WriteLine(result);
}

returns:

2
4
6



回答2:


I have done my research and PowerShell.Invoke( IEnumerable ) will set the InputObject of the first command in the list. Therefore instead of setting InputObject on inputCmd above, we can instead pass it through the Invoke method. We still need the first ForEach-Object call to pass the input array to.



来源:https://stackoverflow.com/questions/13251076/calling-powershell-from-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!