functions/Invoke-RGBatchRequest.ps1

function Invoke-RGBatchRequest { 
    param (
        [uri] $Uri,
        [hashtable] $Query
    )

    Begin {
        $RootObject = (((($Uri -split '/' | Select-Object -Last 1) -split '\?') | Select-Object -First 1) -replace '.json', '')
        $lastResponse = $null
        $offset = 0;
    }
    Process {
        $QueryString = @()
        if ($null -ne $Query) {
            foreach ($Parameter in $Query.GetEnumerator()) {
                <# $currentItemName is the current item #>
                if (-not [string]::IsNullOrEmpty($Parameter.Value)) {
                    $QueryString += "{0}={1}" -f $Parameter.Name, $Parameter.Value
                }
            }
        }

        $MorePages = $true;
        while ($MorePages) {
            $TempQueryString = $QueryString
            if ($offset -ne 0) {
                $TempQueryString += ("offset={0}" -f $offset)
            }

            $TempUrl = Get-RUri -Uri $Uri -Query $TempQueryString
            $response = Invoke-RGRequest -Method 'GET' -Uri $TempUrl
            if ($response.StatusCode -match '2*') {
                $response.$RootObject
                $lastResponse = $response
            }

            if ([bool]($response.PSobject.Properties.name -match "limit") -and ($response.$RootObject.Length -gt 0) -and ($response.total_count -gt $response.limit)) {
                $offset += $lastResponse.limit
            }
            else {
                $MorePages = $false
            }
        }
    }
}