2017-10-06 40 views
2

我有一個複雜的函數(不是一個班輪),它接收一個對象,做一些工作人員,然後它應該返回相同的對象回管道。確保只有預期的對象從一個函數傳遞到管道

函數體打開文件進行寫入,從Web服務下載某些內容等。它還通過打印到控制檯向用戶提供反饋。

function($obj) 
{ 
    do some staff 
    more staff 
    $obj 
} 

我如何確保只有預期的對象被返回到管道,並沒有別的像印刷到能夠從我在函數體中運行命令打印控制檯或什麼文字?

我認爲寫主機不應該影響管道。但不確定其他命令。也許,有一些方法可以做到這一點。還沒有找到任何東西。

+0

吞食只是用個e在函數結尾處返回$ obj語句,以便返回。 –

+2

@SagePourpre這不會使'$ obj'必然成爲傳遞給管道的唯一對象。 –

+0

@ManuelBatsching什麼?!那麼,我不得不爲自己測試這個......當然,你是100%正確的。今天學到的另一件事!謝謝 ! –

回答

0

只有輸出流將被傳遞到管道。如果您使用像Write-Verbose,Write-Warning或(如果您必須)Write-Host cmdlet處理您的控制檯輸出,它們將不會干擾管道。

如果您正在使用帶有返回值的cmdlet,並且您不希望將其傳遞給輸出流或變量,則可以將它們傳輸到Out-Null作爲選項。

+0

Write-Host有問題嗎? –

+0

另外,我不確定每個命令可以返回什麼。例如,它可以保持沉默,然後在遇到錯誤時打印消息。然後它將走向管道。 –

+0

經典的答案是,對於大多數用例來說,'Write-Host'有更好的選擇:fhttp://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/ –

2

一種策略可能是包裹函數體中一個單獨的塊,點源,但由它禁止所有輸出,然後return的變數,您需要從主塊外返回:

function Do-Stuff 
{ 
    param($obj) 

    $null = . { 
    Get-Random 
    $obj.Stuff = "Modified" 
    Write-Output "All sorts of noise" 
    } 
    return $obj 
} 

現在你可以這樣做:

PS C:\> Do-Stuff -obj ([pscustomobject]@{Name="MyObject";Stuff="Original"}) 

Name  Stuff 
----  ----- 
MyObject Modified 

並返回只$obj,一切由$null

+0

這可能有效。需要測試如果任何命令生成某些輸出會發生什麼,它會丟失還是仍然顯示在控制檯中。我想這取決於它是否使用寫 - 詳細,寫主機等 –

+0

它將全部丟失。你可以管''。 {}'聲明到'Write-Host'而不是如果你想讓它顯示在控制檯上 –

+0

Thanks Mathias! –

相關問題