private/New-RetryCommand.ps1


function New-RetryCommand {
    Param(
        [Parameter(Mandatory = $true)]
        [string]$Command,

        [Parameter(Mandatory = $true)]
        [hashtable]$Arguments,

        [Parameter(Mandatory = $false)]
        [int]$MaxNumberOfRetries = 10,

        [Parameter(Mandatory = $false)]
        [int]$RetryDelayInSeconds = 30,

        [Parameter(Mandatory = $false)]
        [String[]]$ignoreableErrors
    )

    $RetryCommand = $true
    $RetryCount = 0
    $RetryMultiplier = 1

    Write-LogMessage -level 6 -message "$Command called with arguments: $($Arguments.Keys)"

    while ($RetryCommand) {
        try {
            & $Command @Arguments
            $RetryCommand = $false
            Write-LogMessage -level 6 -message "$Command succeeded at attempt $RetryCount"
        }catch {
            if ($RetryCount -le $MaxNumberOfRetries) {
                if($ignoreableErrors){
                    foreach($ignoreableError in $ignoreableErrors){
                        if($_ -like "*$ignoreableError*"){
                            Write-LogMessage -level 6 -message "Ignoring error: $($_)"
                            throw $_
                        }
                    }
                }
                Write-LogMessage -level 5 -message "$Command failed, retrying in $($RetryDelayInSeconds * $RetryMultiplier) seconds. Reason: $_"
                Start-Sleep -Seconds ($RetryDelayInSeconds * $RetryMultiplier)
                $RetryMultiplier *= 1.2
                $RetryCount++
            }else {
                Write-LogMessage -level 5 -message "$Command failed permanently after $RetryCount attempts"
                throw $_
            }
        }
    }
}