Files
general-scripts-and-system-…/Windows-Scripts/IM_SO_TIRED_BOSS.ps1
T

61 lines
2.3 KiB
PowerShell

# usage:
## All paramaters are optional
## All paramaters are compatible with each other
## Default behavior is to restart immediately after zero time
## IM_SO_TIRED_BOSS -Seconds <int seconds> -Minutes <int minutes> -Hours <int hours> -ChkDsk $True
## Examples:
### IM_SO_TIRED_BOSS -Minutes 90
### IM_SO_TIRED_BOSS -Minutes 30 -Hours 1
### IM_SO_TIRED_BOSS -Minutes 30 -ChkDsk $True
Param(
[int]$Seconds = 0,
[int]$Minutes = 0,
[int]$Hours = 0,
[bool]$ChkDsk = $false
)
# Force off for longer by doing offline modern chkdsk to tie up your computer to be unusable for a while
# pipes y to it so its noninteractive
# auto elevates to admin when run with -ChkDsk $True
if ($ChkDsk) {
# elevate to admin
# set for offline chkdsk noninteractively by piping y to it lmao
# runs a cmd window as admin running "echo y | chkdsk C: /f /r" which then closes
Start-Process cmd.exe -Verb RunAs -ArgumentList "/c echo y | chkdsk C: /f /r"
}
# Current date object
$CurrentTime = Get-Date
# the .AddX() are in sequence to get the date object plus seconds, minutes, and hours
$RebootTime = $CurrentTime.AddSeconds($Seconds).AddMinutes($Minutes).AddHours($Hours).ToString("dddd hh:mm:ss tt")
# Calculate the number of seconds in total selected time
$WaitDuration = New-TimeSpan -Seconds $Seconds -Minutes $Minutes -Hours $Hours
$WaitSeconds = $WaitDuration.TotalSeconds
# Print to terminal too for nicess
Write-Host "`nREBOOTING AT $RebootTime`n"
# Start-Job to fork the script block to background so it can proceed with the timer/shutdown even if no interaction with alert box
Start-Job -ScriptBlock {
# the $using: method lets me adjusst the scope of $RebootTime and get it in this script block
$RebootTime = $using:RebootTime
# add the presentation framework in
Add-Type -AssemblyName PresentationFramework
# Show an Error/Stop alert box with just an OK button and the message
[System.Windows.MessageBox]::Show("REBOOTING AT $RebootTime", "FORCE REBOOTING MINUTES AT $RebootTime", 'OK', 'Error')
}
# do the wait
Start-Sleep -Seconds $WaitSeconds
# Add-Type -AssemblyName PresentationFramework
# [System.Windows.MessageBox]::Show("PING WORKING", "$RebootTime", 'OK', 'Error')
# x Force reboot with no warning
# Disabled -Force to let apps close gracefully
Restart-Computer # -Force