Public/Restart-Host.ps1

function Restart-Host {
    [CmdletBinding(SupportsShouldProcess = $true,ConfirmImpact='High')]

    Param (
        [switch]$AsAdministrator,
        [switch]$Force
    )

    begin {
        Set-StrictMode -Version Latest
        $proc = Get-Process -Id $PID
        Write-Verbose "Restarting $($proc.Name)"
    }

    process {

        $proc = Get-Process -Id $PID
        $cmdArgs = [Environment]::GetCommandLineArgs() | Select-Object -Skip 1

        $params = @{ FilePath = $proc.Path }
        if ($AsAdministrator) { $params.Verb = 'runas' }
        if ($cmdArgs) { $params.ArgumentList = $cmdArgs }

        if ($Force -or $PSCmdlet.ShouldProcess($proc.Name,"Restart the console")) {
            if ($host.Name -eq 'Windows PowerShell ISE Host' -and $psISE.PowerShellTabs.Files.IsSaved -contains $false) {
                if ($Force -or $PSCmdlet.ShouldProcess('Unsaved work detected?','Unsaved work detected. Save changes?','Confirm')) {
                    foreach ($IseTab in $psISE.PowerShellTabs) {
                        $IseTab.Files | ForEach-Object {
                            if ($_.IsUntitled -and !$_.IsSaved) {
                                $_.SaveAs($_.FullPath,[System.Text.Encoding]::UTF8)
                            } elseif(!$_.IsSaved) {
                                $_.Save()
                            }
                        }
                    }
                } else {
                    foreach ($IseTab in $psISE.PowerShellTabs) {
                        $unsavedFiles = $IseTab.Files | Where-Object IsSaved -eq $false
                        $unsavedFiles | ForEach-Object {$IseTab.Files.Remove($_,$true)}
                    }
                }
            }
            Start-Process @params
            $proc.CloseMainWindow()
        }
    }
}