我的建議是使用管道。一個函數產生塊,另一個函數消耗它們。
使用這種方法,您不需要污染全局/腳本範圍,這不是一個好主意。所需要的一切都保存在需要它的功能中。
function Get-Chunk
{
param(
[Parameter(Mandatory=$true)]$collection,
[Parameter(Mandatory=$false)]$count=10
)
#temporary array
$tmp = @()
$i = 0
foreach($c in $collection) {
$tmp += $c # add item $c to array
$i++ # increase counter; indicates that we reached chunk size
if ($i -eq $count) {
,$tmp # send the temporary array to the pipeline
$i = 0 # reset variables
$tmp = @()
}
}
if ($tmp) { # if there is something remaining, send it to the pipeline
,$tmp
}
}
function Write-ListItems
{
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true)]$chunk
)
process {
write-host Chunk: "$chunk"
}
}
測試功能:
$wholeList = 1..100
Get-Chunk $wholeList | Write-ListItems
Chunk: 1 2 3 4 5 6 7 8 9 10
Chunk: 11 12 13 14 15 16 17 18 19 20
Chunk: 21 22 23 24 25 26 27 28 29 30
Chunk: 31 32 33 34 35 36 37 38 39 40
Chunk: 41 42 43 44 45 46 47 48 49 50
Chunk: 51 52 53 54 55 56 57 58 59 60
Chunk: 61 62 63 64 65 66 67 68 69 70
Chunk: 71 72 73 74 75 76 77 78 79 80
Chunk: 81 82 83 84 85 86 87 88 89 90
Chunk: 91 92 93 94 95 96 97 98 99 100
Get-Chunk $wholeList 32 | Write-ListItems
Chunk: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
Chunk: 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
Chunk: 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
Chunk: 97 98 99 100
更新
我添加了一些意見,以澄清事情了。請注意,發送內容到流水線時(a)我不使用return
,因爲我會從功能中跳出去。 (b)開始時的逗號將$tmp
的內容包裝爲數組,因此它會創建帶有一個項目的新數組(這是N個項目的數組)。爲什麼?因爲在PowerShell中有自動展開的功能,它會從數組中展開項目並將所有項目展平 - >結果將再次成爲一個大數組。
例子:
function Get-Arrays {
1,2,3
"a", "b"
,(get-date)
4,5,6
}
Get-Arrays | % { "$_" }
這按預期工作:
function Get-Arrays {
,(1,2,3)
,("a", "b")
,(get-date)
,(4,5,6)
}
Get-Arrays | % { "$_" }
@JP - 感謝您的建議。這可能比我想要的複雜一點。這是一個單獨使用的腳本,看起來更像是一個C#的想法。另外,在用C#編程時,我傾向於反對通過ref傳遞項目,因爲它們打開了產生副作用的方式(一種功能性編程思想,這被認爲是不可取的)。 – Mike 2011-03-28 23:34:20