2015-10-13 158 views
0

我有一個要求,結合使用.NET中的CmdLets作爲管道輸出給出多個Power Shell腳本的輸出。合併多個PowerShell cmdlet輸出

例如:

Command-GetA -combine Command-GetB | Command-GetD 

所以我想通過管道的GetAGetB輸出發送到GetD。有沒有一種緊湊的方式來使用PowerShell腳本或.NET cmdlet執行此操作?除了將輸出存儲在數組中並將其傳遞到管道之外的其他方法?

另一個複雜的例子可能是:

Command-GetA -combine (Command-GetB | Command-GetD) | Command-GetF 

這應該結合GetAGetB|GetD作爲管道輸入發送到GetF

編輯:

這將是很好,如果我可以做類似這 - @(GetA; GetB)-ConvertToASingleList | GetC

因此OutputOfGetAOutputOfGetB不應該在GetC上單獨調用。雙方應作爲經組合的陣列或列表對象,被傳遞到GetC

回答

0

這給了我,我期望的最終結果:

$(命令木屐;命令GetB)|組結果|命令GETC

因此,如果「GETC」是一串接cmdlet時,整個「GETC」 cmdlet的代碼只運行一次,我所有的輸入文件(我的輸出文件被創建重新我運行「CONCAT」每次)

雖然這裏所有的上述答案是正確的,我的要求是有點不同的:)

編輯:

這是完美的!

,@(命令木屐;命令GetB)|命令GETC

感謝@PetSerAl

+0

因此,您的實際需求*是一個**位**不同*,應該將輸出作爲單個項目傳遞,而不是通過元素傳遞。但是,如果你想傳遞數組作爲單個項目,那麼就沒有其他可能的方法,那麼首先創建該數組並將輸出存儲在其中(這個短語在你的問題中:*除了將輸出存儲在數組中然後傳遞它以管道?*,是真的誤導你的意圖)。如果我對你的真實需求是正確的,那就是你所需要的:',@(Command-GetA; Command-GetB)| Command-GetC'。 – PetSerAl

+0

是的,你是非常正確的!通過這一行,我的意思是我不希望在cmd的一行中聲明單獨的數組。然後使用該數組傳遞給GetC,它將成爲cmd的另一行。我基本上想要完成一行。抱歉,應該正確說出我的問題。 非常感謝! – user3575135

0

那麼不是真的,緊湊,但我會做這樣的:

$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" 
1

通過@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 

腳本塊將所有輸出組合到一個數組中。此行爲記錄在about_Script_Blocks中:

腳本塊將腳本塊中所有命令的輸出作爲單個對象或數組返回。

+0

我認爲您的解決方案是更好,因爲它不緩衝任何東西。 –

相關問題