2013-01-24 14 views
2

從CmdLet發送到管道的項目是否立即傳遞到下一個CmdLet,還是進入一個內部PS「累加器」,將它們存儲起來,直到當前CmdLet完成,然後將它們饋送到下一個?PowerShell管道是否連續進料?

有沒有可以配置連續模式的參數?如果CmdLet接受單個對象,則可以在數據進入管道時調用它,但是如果CmdLet接受一個數組,則PS可能累積並將整個數組發送出去。例如,排序需要一個完整的集合。

我有興趣編寫長時間運行的開放式流風格CmdLets。

謝謝。我無法找到關於管道的任何深入討論。

回答

3

第一部分:不,PowerShell函數不一定會立即傳遞到cmdlet,而是進入名爲$ input的特殊變量。

在函數開始執行之前,$ input將被所有傳入的管道對象填充。如有必要,PowerShell甚至可能會延遲執行,直到所有傳入的管道數據完成。

第二部分:如果您想繼續處理您的數據,而不是等待它進來並保存在$輸入,你可以使用過濾關鍵字到位功能鍵當你編寫你的函數/過濾器時(過濾器的行爲與函數類似,除非它們不等待數據,但在它變得可用時使用它)。

例如

filter Get-OddEven { 
$x = $_ % 2 

# ... other logic here 
} 

希望這有助於,免得我抄襲不過,所有這一切都是從書「微軟的Windows PowerShell編程的絕對新手」傑裏·李·福特,JR得到應該要採取進一步研究。

+2

您還可以使用具有過程塊的功能來處理輸入,如過濾器。例如:'功能測試{處理{每個$ _對象的邏輯}}'。有關高級功能的更多信息:http://technet.microsoft.com/en-us/magazine/hh413265.aspx –