Public/Split-Collection.ps1

<#
.EXAMPLE
$Collection = (65..90) | ForEach-Object { [char]$_ }
$Collection | Split-Collection -ChunkSize 3 | Select-Object -Skip 3 -First 1
 
.EXAMPLE
$Collection = (65..90) | ForEach-Object { [char]$_ }
Split-Collection -Collection $Collection -ChunkSize 5 | Select-Object -Skip 3 -First 1
 
.EXAMPLE
$EmptyCollection = @()
$EmptyCollection | Split-Collection -ChunkSize 2 | Measure-Object
#>

function Split-Collection 
{
    param
    (
        [Parameter(Mandatory, ValueFromPipeline)]
        [PSObject[]]$Collection,

        [Parameter(Mandatory)]
        [ValidateRange(1, [int]::MaxValue)]
        [int]$ChunkSize
    )

    Begin
    {
        [System.Collections.ArrayList]$Chunk = $null
    }

    Process 
    {
        foreach($Item in $Collection)
        {
            if ($null -eq $Chunk)
            {
                $Chunk = New-Object -TypeName System.Collections.ArrayList -ArgumentList $ChunkSize
            }

            $Chunk.Add($Item) | Out-Null

            if ($Chunk.Count -eq $ChunkSize)
            {
                (,$Chunk)
                $Chunk = $null
            }
        }
    }

    End
    {
        if ($null -ne $Chunk)
        {
            (,$Chunk)
        }
    }
}