2011-07-03 145 views
4

說Get-ChildItem返回數百萬個項目。 PowerShell如何處理這個問題?我可以批量處理數據嗎?命令是否會阻止控制檯直到檢索到數據?PowerShell如何處理大型數據集?

我是PowerShell的新手,所以如果有人能夠解釋處理操作返回許多項目/可能需要很長時間才能完成的基本原則,那將會很棒。

回答

6

Powershell cmdlet一次處理一條記錄。如果將get-childitem的輸出傳遞給腳本塊或其他cmdlet,它應該並行執行。也就是說,只要有記錄可用,您的腳本塊就會執行,而get-childitem仍在檢索記錄。當然,因爲它是一個控制檯應用程序,控制檯自然會被阻塞,直到處理完所有記錄,除非在處理記錄期間提示用戶輸入更多數據,或者用戶終止該命令。如果您有時間/資源密集型處理,則可能需要考慮讓您的cmdlet使用後臺作業(請參閱this msdn article)。

+1

從技術上講,您也可以通過讓ProcessRecord方法在您自己的數據結構中累積記錄,然後在EndProcessing方法中處理/生成輸出來將記錄處理爲批處理。儘管這樣做的原因不多,但最好將流處理爲流,以避免額外的內存要求並利用固有的並行性。 –

+1

這是一個很好的答案 - 讓我想到了cmdlet中的Begin,Process和End語句 - 我認爲它們也值得一提。開始將發生一次,在處理第一個記錄之前,對每個記錄重複該過程,並且結束是最後要運行的事情。 與問題沒有太大關係,但值得了解是否要使用自定義cmdlet處理大量數據。 (對任何拼寫錯誤致歉!) – Matt