ps/Modules/Cole.PowerShell.Developer/Public/Invoke-Shutdown.ps1
2023-05-30 22:51:22 -07:00

67 lines
2.2 KiB
PowerShell

function Invoke-Shutdown {
<#
.SYNOPSIS
Wrap the default Windows shutdown command with more helper information
You should just use Stop-Computer or Restart-Computer
.PARAMETER Now
Shutdown the current computer now
.PARAMETER Reboot
Reboot on shutdown
.PARAMETER ComputerName
One or more computers to shut down.
.PARAMETER Minutes
How long to wait before shutting down. Defaults to 1 minute.
.PARAMETER Reason
Provide a reason why we are shutting this computer down
#>
[CmdletBinding()]
[OutputType([void])]
param (
[Parameter(ParameterSetName = 'Now')]
[switch]$Now,
[Parameter(ParameterSetName = 'Computer', Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string[]]$ComputerName,
[Parameter(ParameterSetName = 'Computer', Mandatory = $false)]
[int]$Minutes = 1,
[Parameter()]
[switch]$Reboot,
[Parameter()]
[string]$Reason
)
$arguments = @("/s") # shutdown command
if ($Reboot) {
$arguments = @("/r") # reboot, not shutdown
}
if (-not [string]::IsNullOrWhiteSpace($Reason)) {
$arguments += "/c `"$Reason`""
}
$arguments += "/f" # force it to kill apps
if ($PSCmdlet.ParameterSetName -eq 'Now') {
Write-Host "Shutting system down now"
$arguments += "/t"
$arguments += "0" # now
Invoke-CallOperatorWithPathAndParameters -Path "C:\Windows\system32\shutdown.exe" -Arguments $arguments
} else {
# The timeout value is expressed in seconds, not minutes
$arguments += "/t"
$arguments += "$($Minutes * 60)"
foreach ($computer in $ComputerName) {
if (-not [string]::IsNullOrWhiteSpace($computer)) {
Write-Host "Shutting down remote server $computer"
$computerArguments = @($arguments)
$computerArguments += "/m"
$computerArguments += "\\$computer"
Write-Host "C:\Windows\system32\shutdown.exe $($computerArguments -join ' ')"
Invoke-CallOperatorWithPathAndParameters -Path "C:\Windows\system32\shutdown.exe" -Arguments $computerArguments
}
}
}
}