8

我正在使用System.Management.AutomationDLL,它允许我在 C# 应用程序中调用 PowerShell,如下所示:

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

我想要做的是调用 PowerShell 但提供输入列表。例如,在:

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

1, 2, 3我试图在调用时提供左侧:

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

但是,这不起作用。我想出的解决方法ForEach-Object是使用数组,然后将数组作为 anInputObject{ $_ }as传递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();

虽然上面是工作代码,但有什么方法可以使用Invoke传入输入数组,因为我会认为这是调用它的理想方式?

4

2 回答 2

13

有点晚了,但是:

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

返回:

2
4
6
于 2012-11-25T21:02:51.733 回答
2

我已经完成了研究,PowerShell.Invoke( IEnumerable )并将设置InputObject列表中的第一个命令。因此,我们可以代替上面的设置InputObjectinputCmd而是通过Invoke方法传递它。我们仍然需要第一次ForEach-Object调用来将输入数组传递给。

于 2012-11-06T15:10:22.640 回答