I'm writing a function Chunk-Object
that can chunk an array of objects into sub arrays. For example, if I pass it an array @(1, 2, 3, 4, 5)
and specify 2
elements per chunk, then it will return 3 arrays @(1, 2)
, @(3, 4)
and @(5)
. Also the user can provide an optional scriptblock
parameter if they want to process each elements before chunk them into sub arrays. Now my code is:
function Chunk-Object()
{
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true,
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true)] [object[]] $InputObject,
[Parameter()] [scriptblock] $Process,
[Parameter()] [int] $ElementsPerChunk
)
Begin {
$cache = @();
$index = 0;
}
Process {
foreach($o in $InputObject) {
$current_element = $o;
if($Process) {
$current_element = & $Process $current_element;
}
if($cache.Length -eq $ElementsPerChunk) {
,$cache;
$cache = @($current_element);
$index = 1;
}
else {
$cache += $current_element;
$index++;
}
}
}
End {
if($cache) {
,$cache;
}
}
}
(Chunk-Object -InputObject (echo 1 2 3 4 5 6 7) -Process {$_ + 100} -ElementsPerChunk 3)
Write-Host "------------------------------------------------"
(echo 1 2 3 4 5 6 7 | Chunk-Object -Process {$_ + 100} -ElementsPerChunk 3)
The result is:
PS C:\Users\a> C:\Untitled5.ps1
100
100
100
100
100
100
100
------------------------------------------------
101
102
103
104
105
106
107
PS C:\Users\a>
As you can see, it works with piped in objects, but does not work with values get from parameter. How to modify the code to make it work in both cases?