Modules/AutoShutdown/autoshutdown.psm1
|
<# .SYNOPSIS Stops (shuts down) local computer at a specified time. .DESCRIPTION The ``Stop-ComputerLater`` cmdlet shuts down the local computer after two hours by default. You can use the parameters of Stop-ComputerLater to specify the shutdown time or cancel a scheduled shutdown. A minute before the computer is stopped, a notification will be displayed. .PARAMETER Minutes Specifies the time in minutes until the computer stops. Default 120 minutes. .PARAMETER Cancel Cancels a scheduled computer shutdown. .PARAMETER ShutdownNow Shuts down the computer now. .PARAMETER ShutdownInMinute Shuts down the computer in a minue. .EXAMPLE Stop-ComputrLater .EXAMPLE Stop-ComputerLater -Minutes 23 .EXAMPLE Stop-ComputrLater -Cancel #> function Stop-ComputerLater{ [OutputType([Windows.UI.Notifications.ToastNotificationManager])] [CmdletBinding(SupportsShouldProcess)] Param( [Parameter(ParameterSetName='Default', Position=0)] [System.String]$Minutes = 120, [Parameter(ParameterSetName='Cancle')] [switch]$Cancel, [Parameter(ParameterSetName='ShutdownNow')] [switch]$ShutdownNow, [Parameter(ParameterSetName='ShutdownInMinute')] [switch]$ShutdownInMinute ) if($Minutes -eq 0){ $ShutdownNow = $true } elseif($Minutes -eq 1){ $ShutdownInMinute = $true } if($Cancel){ if(Get-ScheduledTaskInfo -TaskName "Stop-Computer" -ErrorAction Ignore){ Unregister-ScheduledTask -TaskName "Stop-Computer" -Confirm:$false } else{ Write-Output "Scheduled task does not exist." } } else{ if($ShutdownNow){ if(Get-ScheduledTaskInfo -TaskName "Stop-Computer" -ErrorAction Ignore){ Unregister-ScheduledTask -TaskName "Stop-Computer" -Confirm:$false } Stop-Computer -Force Write-Verbose "There is nothing to collect." } elseif($ShutdownInMinute){ if(Get-ScheduledTaskInfo -TaskName "Stop-Computer" -ErrorAction Ignore){ Unregister-ScheduledTask -TaskName "Stop-Computer" -Confirm:$false } $t=(Get-Date).AddMinutes(1) $action=New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-WindowStyle Hidden -command Stop-ComputerLater -ShutdownNow" $triger=New-ScheduledTaskTrigger -Once -At $t $options=New-ScheduledTaskSettingsSet -Hidden -DontStopIfGoingOnBatteries Register-ScheduledTask -TaskName "Stop-Computer" -Action $action -Settings $options -Trigger $triger >> $null $ToastTitle = "Autoshutdown" $ToastText = "The computer will shut down in less than a minute" [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null $Template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02) $RawXml = [xml] $Template.GetXml() ($RawXml.toast.visual.binding.text|Where-Object {$_.id -eq "1"}).AppendChild($RawXml.CreateTextNode($ToastTitle)) > $null ($RawXml.toast.visual.binding.text|Where-Object {$_.id -eq "2"}).AppendChild($RawXml.CreateTextNode($ToastText)) > $null $SerializedXml = New-Object Windows.Data.Xml.Dom.XmlDocument $SerializedXml.LoadXml($RawXml.OuterXml) $Toast = [Windows.UI.Notifications.ToastNotification]::new($SerializedXml) $Toast.Tag = "shutdown" $Toast.Group = "shutdown" $Toast.ExpirationTime = [DateTimeOffset]::Now.AddMinutes(1) $Notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("APS") $Notifier.Show($Toast); } else{ $t=(Get-Date).AddMinutes($Minutes) $action=New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-WindowStyle Hidden -command Stop-ComputerLater -ShutdownInMinute" $triger=New-ScheduledTaskTrigger -Once -At $t.AddMinutes(-1) $options=New-ScheduledTaskSettingsSet -Hidden -DontStopIfGoingOnBatteries if(!(Get-ScheduledTaskInfo -TaskName "Stop-Computer" -ErrorAction Ignore)){ Register-ScheduledTask -TaskName "Stop-Computer" -Action $action -Settings $options -Trigger $triger >> $null } else{ Set-ScheduledTask -TaskName "Stop-Computer" -Trigger $triger >> $null } Write-Output "Computer will shutdown at $('{0:HH:mm:ss}' -f $t)" } } } Set-Alias -Name "spcl" -Value Stop-ComputerLater # SIG # Begin signature block # MIIIWAYJKoZIhvcNAQcCoIIISTCCCEUCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUkVg7CpOlOeiKidD7293nVRCs # YyCgggT6MIIE9jCCAt6gAwIBAgIQYYPyfUBBC6pE/rAfOslXOzANBgkqhkiG9w0B # AQsFADATMREwDwYDVQQDDAhha290dSBDQTAeFw0yMjA5MjAxOTQ4MDFaFw0zMjA5 # MjAxOTU4MDFaMBMxETAPBgNVBAMMCGFrb3R1IENBMIICIjANBgkqhkiG9w0BAQEF # AAOCAg8AMIICCgKCAgEAvGcae/FCZugTbghxO7Qv9wQKvRvp9/WvJyJci/SIsPr1 # /Mf5wfBTJ3aCvyjFvHfcsDH4NdHZubHO531tc1NHCDh+Ztkr5hbOdl3x46nEXm6u # e4Fiw23SB02dU3dAnFvNSGEE5jhQDOApGX/u7xEW4ZXrvMC5yLCBa3Kva1abPx5b # owvQlHhiSsn039/K2xSNhR+x4QcgEIo9JYdcob0f7ZY3AhXT+f1PNyYe075SY+t2 # y1YMlPlq4THolVUB4yB5MknAOG7IoxFt0U9vXhMSjbb06LZ/I/2RpAJd/qcaC/aX # CBvKYQbbmEqMqKutic/Q23cQU2jcuRxyy+Y5QphALwdkQGIuvOOIQCak/ZKa6k5S # 5U3zcMSbGOFF1BHdLSmcUnicsuvMM4uOT0zF/yzuSv5fSo3t6W5VHa+1Ct8ygt3/ # Byq2dLPskUPn0khR3/PaC8Px0k6TpcL1auKeb/uObvckBH/NVvQebtFuXMFXCayw # ZFQx2dGfqb20Q5ZDNw5u8PtrSAeTaqZ7shrcsHbi59ztASvNjapdnhosQ26ir5bD # Urzn7Fm/R/tZ9wpCuZ6i2LErckKGMW0Lk1ku0HJv83q/rr0vkrbEXUWx6eaaXwQj # IacKX8IvED/HN1gQ9WfkvLmQurF9ZUfJQDC/WNrIwYw4advSARKs/4WE+HmN1g0C # AwEAAaNGMEQwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB0G # A1UdDgQWBBSUHb/MW3YJQEoACPnV20ZgngOGCDANBgkqhkiG9w0BAQsFAAOCAgEA # C6pw+UgUjitD9crDEpEPIcmC/Eiif7DnMI2xG1aS8drSFkTvJdmG1yI4gUigjncb # LfDSLbUIwAUfaM6V1zPb/ec0dg0Nkn+Za1fpuIXxuPKtvrqr9FLfc70D3AphNrDD # rFEd3c1ykLed7lllMYaLXkfWDRlxhhpP+LR9qbgvTxFbWk/7yA7kJrwEaDgfqqME # QEE9xZDEIN/f1ycTnh0qmUwYoHDEKbOet/OgiILjzqIjplnaaKJIzFjmfDDK8JY+ # 0tl3hnyFHkPVe9sKTIEVhjc8XlaaCDDTEPTiWvB3TPMLZCqcwqQ4WdcWpS0Dp1Ms # XvRVv8NkcDMPzFpgqFpkkrkqt94IESUycaAQe+czlurf/KiQjzAjVvhZFspqbBi8 # 83AZ9+mBQhtQqgzcZYSF2LAPbfTXCPw8daT/hOrUaU72YrA4ON64ZRYvcaj9u1AN # +pxo8TY+YNak+tVByU3sfLfFwbJMJi63be1yo1yLc3b/d3DrJz3AIY82LrtdQcT3 # tj3QnyvVHpFvtzKZxO5hSgaTksmRBYJZ6cYcBgW69l8UpppiyAtzKo4AvD1XXlc6 # ehYjdBVms5F9spAWjwzXg9lWQSsul7V6WB7/PIaTF4hsZ9IylRl4FnBwcJbTdjXi # E8oA77fIHMj6jOyxEeP6WGzjDYxBnLKyV/lVqk7WkqkxggLIMIICxAIBATAnMBMx # ETAPBgNVBAMMCGFrb3R1IENBAhBhg/J9QEELqkT+sB86yVc7MAkGBSsOAwIaBQCg # eDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEE # AYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJ # BDEWBBQ7ShXQI581PmDM9s3DMGSECr1/LDANBgkqhkiG9w0BAQEFAASCAgAB5Bm2 # FQO+9sgB+uWG/5cPadrkeA9IAaA4CdDR76hC/xqV1mDBJTIaowPX7uu2MhtQ12Mq # rGwtCqxKJsUvz/VQmbeKKNIWROl9utVRQf28Mc9SINJGMAPzhYku+b5j2M3uIlwR # HEvp7McWnU8ix+EkzponfdTmft8q0BcTH/4BAx5ZZWTc4lUr4U1ngPCTpmvJR5P1 # QPilp7ujVmfUVYSpKt67Qjkgpbm4U+XevOGOviElhGDnWTWbSWMj5vAONB2MMdgV # 0YPPDiBQ+zdz5Iw+B16zq9O5NECDZ/o7BNup8WAvubIRiKp1Z8daE98DialsKsND # U9ln0gd4xQTKk1k1wNtZkppbRNyLu914a3//sJnhSSE2QB0ON/dzAFZsQU7xSFY6 # lSTudLs2a6sQ3yNk/drqyoRULWuIAlflqrf258H+82zoaqTz0DrBfo2N86aSKIwA # NgxQNnClDEJnYn5sf+XKpGjRH2WN+N3btVcExO/alG8evWW113fUVo5x6zhlIfyW # d1HDJIdgH4wJg/EgogYivXYNFadW9cnynEkpirUQIwGeeqeD+AqLOhCp9BNtuAvv # JJVFOib5gaGpiW66PR8vwJrmOCBplpScbcRDPfJt7lZLfodPwPCV8CARoC8Bti7I # rPNc3qmhSNfcPzqdh86W2vGPsTt9UMlvVQJmBw== # SIG # End signature block |