我最近开始探索 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 版。