Wait-RemoteScriptSession.ps1

function Wait-RemoteScriptSession {
        <#
        .SYNOPSIS
            Polls for the specified job until it has completed.

        .DESCRIPTON
            The Wait-RemoteScriptSession command waits for a ScriptSession to complete processing.
    
        .PARAMETER Session
            The ScriptSession object to poll.

        .PARAMETER Id
            The id of the asynchronous job returned when calling Invoke-RemoteScript with the -AsJob switch.

        .PARAMETER Delay
            The polling interval in seconds.
    
        .EXAMPLE
            The following example remotely rebuilds link databases as a job and waits for it to complete.
            The Invoke-RemoteScript command returns a ScriptSession object.

            $session = New-ScriptSession -Username admin -Password b -ConnectionUri http://remotesitecore
            $jobId = Invoke-RemoteScript -Session $session -ScriptBlock {
                    "master", "web" | Get-Database |
                        ForEach-Object {
                            [Sitecore.Globals]::LinkDatabase.Rebuild($_)
                        }
            } -AsJob
            Wait-RemoteScriptSession -Session $session -Id $jobId -Delay 5 -Verbose
            Stop-ScriptSession -Session $session

        .LINK
            New-ScriptSession

        .LINK
            Invoke-RemoteScript

        .LINK
            Stop-ScriptSession

        .LINK
            Wait-RemoteSitecoreJob
    #>

    
    [CmdletBinding()]
    param(
        [Parameter(ParameterSetName='Session')]
        [ValidateNotNull()]
        [pscustomobject]$Session,

        [ValidateNotNullOrEmpty()]
        [string]$Id,

        [int]$Delay = 1
    )
    
    $doneScript = {
        $backgroundScriptSession = Get-ScriptSession -Id $using:id
        $isDone = $backgroundScriptSession -eq $null -or $backgroundScriptSession.State -ne "Busy"
        [PSCustomObject]@{
            "Name" = $backgroundScriptSession.Id
            "IsDone" = $isDone
            "Status" = "$($backgroundScriptSession.State)"
        }
    }
    $finishScript = {
        $backgroundScriptSession = Get-ScriptSession -Id $using:id
        $backgroundScriptSession | Receive-ScriptSession
    }

    $keepRunning = $true
    while($keepRunning) {
        $response = Invoke-RemoteScript -Session $session -ScriptBlock $doneScript -Verbose
        if($response -eq $null) {
            Write-Verbose "Stopped polling job $($id). No results were returned from the service."
            break
        } elseif ($response -eq "login failed") {
            Write-Verbose "Stopped polling job. Login with the specified account failed."
            break            
        }
        
        if($response -and $response.IsDone) {
            $keepRunning = $false
            Write-Verbose "Polling job $($response.Name). Status : $($response.Status)."
            Write-Verbose "Finished polling job $($id)."
            Invoke-RemoteScript -Session $session -ScriptBlock $finishScript
        } else {
            Write-Verbose "Polling job $($response.Name). Status : $($response.Status)."
            Start-Sleep -Seconds $Delay
        }
    }
}