.net 组合多个powershell cmdlet输出

.net 组合多个powershell cmdlet输出,.net,powershell,c#-4.0,pipeline,cmdlets,.net,Powershell,C# 4.0,Pipeline,Cmdlets,我需要在.NET中使用cmdlet将多个Power Shell脚本的输出合并为管道输出 例如: Command-GetA -combine Command-GetB | Command-GetD 所以我想通过管道将GetA和GetB的输出发送到GetD。是否有一种使用powershell脚本或.NET cmdlet实现此目的的紧凑方法?除了将输出存储在一个数组中然后将其传递给管道这样的方式之外 另一个复杂的例子可能是: Command-GetA -combine ( Command-G

我需要在.NET中使用cmdlet将多个Power Shell脚本的输出合并为管道输出

例如:

Command-GetA  -combine  Command-GetB | Command-GetD
所以我想通过管道将
GetA
GetB
的输出发送到
GetD
。是否有一种使用powershell脚本或.NET cmdlet实现此目的的紧凑方法?除了将输出存储在一个数组中然后将其传递给管道这样的方式之外

另一个复杂的例子可能是:

Command-GetA  -combine  ( Command-GetB | Command-GetD ) | Command-GetF
这应该结合
GetA
GetB|GetD
作为管道输入发送到
GetF

编辑:

如果我能像这样-@(GetA;GetB)-转换为SingleList|GetC,那就太好了


因此,
OutputOfGetA
OutputOfGetB
不应该在
GetC
上单独调用。两者都应该作为一个组合数组或列表对象传递给
GetC

不是很紧凑,但我希望这样做:

    $alldata = @()

    $geta = command-geta
    $getb = command-getb
    $getc = command-getc


    #of course creating a function would be much more nicer in case the structure of A, B and C is the same

    foreach ($a in $geta)
        {
        $temp = New-Object System.Object
        $temp | Add-Member -MemberType NoteProperty -Name "aonedata" -Value $a.one
        $temp | Add-Member -MemberType NoteProperty -Name "atwodata" -Value $a.two
        $alldata += $temp   
        }

    foreach ($b in $getb)
        {
        $temp = New-Object System.Object
        $temp | Add-Member -MemberType NoteProperty -Name "bonedata" -Value $b.one
        $temp | Add-Member -MemberType NoteProperty -Name "btwodata"    -Value $b.two
        $alldata += $temp   
        }

    foreach ($c in $getc)
        {
        $temp = New-Object System.Object
        $temp | Add-Member -MemberType NoteProperty -Name "conedata" -Value $c.one
        $temp | Add-Member -MemberType NoteProperty -Name "ctwodata" -Value $c.two
        $alldata += $temp   
        }

    write-host $alldata
    $alldata | convertto-csv | out-file "c:\temp\lotsofdata.txt"

@PetSerAl建议的解决方案似乎符合您的要求:

PS C:\> function Foo { 1..3 }
PS C:\> function Bar { 2..4 }
PS C:\> & { Foo; Bar | % { $_ + 2 } } | oh
1
2
3
4
5
6
脚本块将所有输出合并到一个数组中。此行为记录在:

脚本块以单个对象或数组的形式返回脚本块中所有命令的输出


这给了我想要的最终结果:

$(命令GetA;命令GetB)|组结果|命令GetC

因此,如果“GetC”是一个串联cmdlet,则整个“GetC”cmdlet代码只对我的所有输入文件运行一次(每次运行“concat”时,我的输出文件都会重新创建)

虽然以上所有答案都是正确的,但我的要求有点不同:)

编辑:

这太完美了

,@(命令GetA;命令GetB)|命令GetC


谢谢@PetSerAl

如果有人有一些奇怪的边缘案例,而上面的情况不适用,你也可以使用-join

例如


这将产生一个适合csv的字符串。

因此,您的实际需求有点不同,输出应该作为单个项传递,而不是按元素传递。但是,如果您想将数组作为单个项传递,那么没有其他可能的方法可以先创建该数组并将输出存储在其中(您问题中的短语:除了将输出存储在数组中然后将其传递到管道?之类的方法外,对您的意图确实存在误导)。如果我对你真正的需求是正确的,那么这就是你所需要的:
,@(Command GetA;Command GetB)| Command GetC
。是的,你是非常正确的!这一行的意思是我不希望在cmd的一行中声明一个单独的数组。然后使用数组传递给GetC,这将成为cmd的另一行。我基本上想在一行中完成它。对不起,我应该恰当地回答我的问题。谢谢!我认为你的解决方案更好,因为它不缓冲任何东西。
-join($(Command-GetA), "," , $(Command-GetB))