Cmdlets/Retry-SdtCommand.ps1

function Retry-SdtCommand
{
    [CmdletBinding()]
    Param(
        [Parameter(Position=0, Mandatory=$true)]
        [scriptblock]$ScriptBlock,

        [Parameter(Position=1, Mandatory=$false)]
        [int]$Maximum = 5,

        [Parameter(Position=2, Mandatory=$false)]
        [int]$Delay = 5000
    )

    Begin {
        $cnt = 0
    }

    Process {
        do {
            $cnt++
            try {
                $ScriptBlock.Invoke()
                return
            } catch {                
                $formatstring = "{0} : {1}`n{2}`n" +
                            " + CategoryInfo : {3}`n" +
                            " + FullyQualifiedErrorId : {4}`n"
                $fields = $_.InvocationInfo.MyCommand.Name,
                            $_.ErrorDetails.Message,
                            $_.InvocationInfo.PositionMessage,
                            $_.CategoryInfo.ToString(),
                            $_.FullyQualifiedErrorId

                $returnMessage = $formatstring -f $fields;
                $returnMessage = "Retry-SdtCommand failed for ScriptBlock => `n$ScriptBlock`n" + $returnMessage;
                
                Start-Sleep -Milliseconds $Delay
            }
        } while ($cnt -lt $Maximum)

        # Throw an error after $Maximum unsuccessful invocations. Doesn't need
        # a condition, since the function returns upon successful invocation.
        throw $returnMessage
    }
<#
.SYNOPSIS
This function can be used to execute same code for specified number of times
.DESCRIPTION
This function helps to retry an action a number of times by executing same code inside try/catch.
.PARAMETER ScriptBlock
Scripblock to execute for multiple times
.PARAMETER Maximum
Number of retries to perform
.PARAMETER Delay
Time of pause between each retry
.EXAMPLE
Retry-SdtCommand -ScriptBlock {
    # do something
}
.EXAMPLE
Retry-SdtCommand -ScriptBlock {
    # do something
} -Maximum 10
.LINK
https://stackoverflow.com/a/45472343/4449743
#>

}