C# 如何将脚本块合并到托管的powershell环境中

C# 如何将脚本块合并到托管的powershell环境中,c#,powershell,hosting,scriptblock,C#,Powershell,Hosting,Scriptblock,我最近开始研究powershell脚本和powershell托管 在powershell命令提示符下,以下行将按预期执行 "fee" | &{ process { $_; $args } } "fi" "fo" "fum" 此脚本输出管道中的“费用”($ux)加上作为参数传递给scriptBlock($args)的“fi”、“fo”和“fum” 我试图通过使用System.Management.Automation.Powershell类来实现同样的结果 当我尝试这个:

我最近开始研究powershell脚本和powershell托管

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

"fee" | &{ process { $_; $args } } "fi" "fo" "fum"
此脚本输出管道中的“费用”($ux)加上作为参数传递给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));
        }
        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));
        }
我的结果数组包含一个空元素(不确定那里发生了什么)

如果我尝试这样做:

        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));
        }
        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));
        }
只输出“费用”。$args数组为空

最后,当我尝试这一点时:

        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));
        }
        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 framework的版本4.5和System.Management.Automation程序集的版本3。

这是因为
AddScript
使用了错误的脚本,
&{}
不应该使用,因为它实际上是由C#code中的
Invoke()
完成的。下面是C#代码的PowerShell模拟程序:

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

fee
fi
fo
fum

果然如此。

这个答案有用吗?老兄,你太棒了!在这篇文章之前,我尝试过的许多排列中有一种与您的完全相同,除了我的脚本是“{process{$\u;$args;}}.”当我执行时,我只会得到一个包含scriptBlock对象的单一结果。呃,现在说起来很有道理,但是昨天我没有理由去尝试。我正在创建一个scriptBlock(使用AddScript),它正在创建另一个scriptBlock作为其输出。非常感谢你把这个讲清楚。