Private/Start-Maintenance.ps1

function Start-Maintenance {
    #Requires -Version 3.0

    [CmdletBinding()]
    Param (
        [Parameter(Mandatory)]
        [string]$ComputerName,
        [switch]$EnableMaintenanceLog
    )

    $ErrorActionPreference = 'Stop'

    Write-Debug -Message ('ENTER {0}' -f $MyInvocation.MyCommand.Name)

    try {
        Write-Debug -Message ('ENTER TRY {0}' -f $MyInvocation.MyCommand.Name)

        Write-Debug -Message ('$ComputerName = ''{0}''' -f $ComputerName)
        Write-Debug -Message ('$EnableMaintenanceLog = ${0}' -f $EnableMaintenanceLog)

        Write-Debug -Message ('Invoke-WindowsUpdate -ComputerName ''{0}''' -f $ComputerName)
        Invoke-WindowsUpdate -ComputerName $ComputerName

        Write-Debug -Message ('$null = Invoke-CustomScriptBlockCommand -Mode ''PostUpdate'' -ComputerName ''{0}'' -Variables (Get-Variable | Where-Object -FilterScript {{$_ -is [System.Management.Automation.PSVariable]}})' -f $ComputerName)
        $null = Invoke-CustomScriptBlockCommand -Mode 'PostUpdate' -ComputerName $ComputerName -Variables (Get-Variable | Where-Object -FilterScript {$_ -is [System.Management.Automation.PSVariable]})

        Write-Debug -Message ('$PendingReboot = Get-PendingReboot -ComputerName {0}' -f $ComputerName)
        $PendingReboot = Get-PendingReboot -ComputerName $ComputerName
        Write-Debug -Message ('$PendingReboot = {0}' -f $PendingReboot)
        Write-Debug -Message 'if ($PendingReboot)'
        if ($PendingReboot) {
            Write-Debug -Message ('Invoke-ComputerRestart -ComputerName {0}' -f $ComputerName)
            Invoke-ComputerRestart -ComputerName $ComputerName
        }

        Write-Debug -Message ('$EnableMaintenanceLog = ${0}' -f $EnableMaintenanceLog)
        Write-Debug -Message 'if ($EnableMaintenanceLog)'
        if ($EnableMaintenanceLog) {
            Write-Debug -Message ('Set-MaintenanceState -ComputerName ''{0}''' -f $ComputerName)
            Set-MaintenanceState -ComputerName $ComputerName
        }

        Write-Debug -Message ('EXIT TRY {0}' -f $MyInvocation.MyCommand.Name)
    }
    catch {
        Write-Debug -Message ('ENTER CATCH {0}' -f $MyInvocation.MyCommand.Name)

        Write-Debug -Message ('{0}: $PSCmdlet.ThrowTerminatingError($_)' -f $MyInvocation.MyCommand.Name)
        $PSCmdlet.ThrowTerminatingError($_)

        Write-Debug -Message ('EXIT CATCH {0}' -f $MyInvocation.MyCommand.Name)
    }

    Write-Debug -Message ('EXIT {0}' -f $MyInvocation.MyCommand.Name)
}