stop-service cmdlet timeout possible?
Although Stop-Service
does not have a timeout parameter, the WaitForStatus
method on the System.ServiceController
class does have an overload that takes a timeout parameter (documented here). Fortunately, this is exactly the type of object that the Get-Service
command returns.
Here is a simple function that takes a service name and a timeout in seconds. It returns $true
if the service stops before the timeout is reached, and $false
if the call times out (or if the service isn't present).
function Stop-ServiceWithTimeout ([string] $name, [int] $timeoutSeconds) { $timespan = New-Object -TypeName System.Timespan -ArgumentList 0,0,$timeoutSeconds $svc = Get-Service -Name $name if ($svc -eq $null) { return $false } if ($svc.Status -eq [ServiceProcess.ServiceControllerStatus]::Stopped) { return $true } $svc.Stop() try { $svc.WaitForStatus([ServiceProcess.ServiceControllerStatus]::Stopped, $timespan) } catch [ServiceProcess.TimeoutException] { Write-Verbose "Timeout stopping service $($svc.Name)" return $false } return $true}
There is no timeout option for stop-service, but if there are dependent services, you may need to use -force.
Services can define a wait hint (which specifies a timeout) when they start, but the timeout is controlled by the service. Any service control requests (start, stop, pause, resume) go through the service control manager (SCM) and will respect the wait hint for each service. If the wait hint is exceeded, the operation will fail and an error be returned.
You could use invoke-command to run Stop-Service as a job and check it periodically. If it hasn't completed, you could use Stop-Process to kill the process and continue.
If you have powershell 5.1 you also have :
Stop-Service -Name "NameOfService" -NoWait
But answer of @JamesQMurphy looks good too, if you don't have the 5.1 version of powershell.