繁体   English   中英

从C#调用PowerShell

[英]Calling PowerShell From C#

我正在使用System.Management.Automation DLL,它允许我在我的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 ,然后将数组作为InputObject传递,并使用{ $_ }作为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传递,因为我会有这样的方法来调用它?

有点迟了但是:

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

我完成了我的研究, PowerShell.Invoke( IEnumerable )将在列表中设置第一个命令的InputObject 因此,我们可以将其传递给Invoke方法,而不是在上面的inputCmd上设置InputObject 我们仍然需要第一个ForEach-Object调用来传递输入数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM