【问题标题】:Calling PowerShell From C#从 C# 调用 PowerShell
【发布时间】:2012-10-26 09:48:15
【问题描述】:

我正在使用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 传入输入数组,因为我会认为这是一种理想的调用方式?

【问题讨论】:

    标签: c# powershell automation


    【解决方案1】:

    有点晚了,但是:

    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
    

    【讨论】:

    • 这可行,但您将1,2,3 作为字符串而不是数组传递,即new int[] { 1,2,3 }。如果我要将结构化数据传递到管道,则需要第二个。
    • @TahirHassan 我知道传递创建的.net 对象的唯一方法是使用SessionStateProxy.SetVariable(string name, object value)。看看我编辑的答案。
    • 您已经回答了我关于如何使用数组启动管道的问题(没有使用我的问题中所述的InputObject 参数将其传递给ForEach-Object)。谢谢。
    • @TahirHassan 很高兴为您提供帮助!
    【解决方案2】:

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

    【讨论】:

    • 这真是天才!我永远不会在那里寻找它!
    猜你喜欢
    • 1970-01-01
    • 2013-06-08
    • 2011-05-09
    • 2019-04-08
    • 2016-08-16
    • 2021-08-31
    • 2019-05-13
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多