1

我最近开始探索 powershell 脚本以及 powershell 托管。

在 powershell 命令提示符下,以下行将按我的预期执行。

"fee" | &{ process { $_; $args } } "fi" "fo" "fum"

此脚本输出管道中的“费用” ($_) 以及作为参数传入 scriptBlock ($args) 的“fi”、“fo”和“fum”。

我试图通过使用 System.Management.Automation.Powershell 类来实现同样的结果。

当我尝试这个时:

        using (var ps = PowerShell.Create())
        {
            var result = ps
                .AddScript(@"&{ process { $_; $args} }")
                    .AddArgument("fi")
                    .AddArgument("fo")
                    .AddArgument("fum")
                .Invoke(Enumerable.Repeat("fee", 1));
        }

我的结果数组包含一个空元素(不确定那里发生了什么)。

如果我试试这个:

        using (var ps = PowerShell.Create())
        {
            var result = ps
                .AddCommand("Invoke-Command")
                    .AddParameter("ScriptBlock", ScriptBlock.Create(@"&{ process { $_; $args } }"))
                    .AddParameter("ArgumentList", new string[] { "fi", "fo", "fum"})
                .Invoke(Enumerable.Repeat("fee", 1));
        }

仅输出“费用”。$args 数组为空。

最后,当我尝试这个时:

        using (var ps = PowerShell.Create())
        {
            var result = ps
                .AddCommand("Invoke-Command")
                    .AddParameter("ScriptBlock", ScriptBlock.Create(@"&{ process { $_; $args } } ""fi"" ""fo"" ""fum"""))
                .Invoke(Enumerable.Repeat("fee", 1));
        }

我离得最近。流水线的“fee”,以及“fi”、“fo”和“fum”参数都是输出。然而,这样做的问题是,理想情况下,我更愿意将我的参数动态传递给 scriptBlock,而不是将它们连接到脚本块表达式中。

我的问题是如何在托管的 powershell 环境中创建一个脚本块,它既可以访问从中调用它的管道中的数据,也可以接受参数?我只能实现其中之一。我正在使用 .Net 框架的 4.5 版和 System.Management.Automation 程序集的 3 版。

4

1 回答 1

1

这是因为使用了错误的脚本AddScript&{}不应该使用,因为它实际上是Invoke()在 C# 代码中完成的。这是有效的 C# 代码的 PowerShell 类似物:

$ps = [powershell]::Create()
$ps.AddScript('process { $_; $args}').
AddArgument('fi').
AddArgument('fo').
AddArgument('fum').
Invoke(@('fee'))

输出:

fee
fi
fo
fum

正如预期的那样。

于 2014-09-15T23:21:00.643 回答