public/Test-RebootPending.ps1


function Test-RebootPending {
    <#
    .SYNOPSIS
        Return true if a reboot is pending (local machine)
    .EXAMPLE
        if (Test-DsRebootPending) { ... }
    .NOTES
        Thanks to https://4sysops.com/archives/use-powershell-to-test-if-a-windows-server-is-pending-a-reboot/
    .OUTPUTS
        True or False
    .LINK
        https://github.com/Skatterbrainz/helium/blob/master/docs/Test-RebootPending.md
    #>

    [CmdletBinding()]
    [OutputType()]
    param ()
    $pendingRebootTests = @(
        @{
            Name = 'RebootPending'
            Test = { Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing' -Name 'RebootPending' -ErrorAction Ignore }
            TestType = 'ValueExists'
        }
        @{
            Name = 'RebootRequired'
            Test = { Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update' -Name 'RebootRequired' -ErrorAction Ignore }
            TestType = 'ValueExists'
        }
        @{
            Name = 'PendingFileRenameOperations'
            Test = { Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Name 'PendingFileRenameOperations' -ErrorAction Ignore }
            TestType = 'NonNullValue'
        }
    )
    $result = $false
    foreach ($test in $pendingRebootTests) {
        $result = Invoke-Command -ScriptBlock $test.Test
        if ($test.TestType -eq 'ValueExists' -and $result) {
            #Write-Verbose "$($test.Name) = TRUE"
            $result = $true
        } elseif ($test.TestType -eq 'NonNullValue' -and $result -and $result.($test.Name)) {
            #Write-Verbose "$($test.Name) = TRUE"
            $result = $true
        } else {
            #Write-Verbose "$($test.Name) = FALSE"
        }
    }
    $result
}