我最近开始探索PowerShell脚本以及PowerShell托管。
在powershell命令提示符下,以下行按照我的预期执行。
"fee" | &{ process { $_; $args } } "fi" "fo" "fum"
此脚本输出"费用"在管道中($ _)加上" fi"," fo"和" fum"作为参数传递给scriptBlock($ args)。
我试图通过使用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));
}
我的结果数组包含一个null元素(不确定那里会发生什么)。
如果我试试这个:
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));
}
我最近了。流水线"费用"," fi"," fo"和" fum"参数都是输出。然而,问题在于我理想地希望动态地将我的参数传递给scriptBlock,而不是将它们连接到脚本块表达式中。
我的问题是如何在托管的PowerShell环境中创建脚本块,该环境既可以访问调用它的管道中的数据,也可以接受参数?我只能做到一个或另一个。我正在使用.Net框架的4.5版和System.Management.Automation程序集的版本3.
答案 0 :(得分: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
正如所料。