Powershell – get-service using powershell does not return

powershell

If I send this two-liner to Powershell

$sName = "ALG"
$service = Get-Service -computername db-name -Name $sName

I will get back information about that service on that computer. If I change the name to "db-nameXXX" (bogus name) I will get an error that the service is not found. However, I have a server that stops accepting remote-desktop sessions (I also can't connect with MS SQL Manaagement studio) and sending these commands to that machine (when in an error condition) just hangs… The script runs but never returns. I would like to have a 'time out' functionality so that at a certain point, I can output a message saying the machine is not responding. Right now, the script is not letting me do anything. I tried a start/process/end block, but as long as get-service does not come back with an error, I can't get anywhere.

Best Answer

Try something like this:

$sb = [scriptblock]::create("Get-Service -computername db-name -Name $sName")
$job = Start-Job -ScriptBlock $sb | Wait-Job -Timeout 10
if($job -eq $null) {
    #timed out
}
else {
     $service = Receive-Job $job
}

This will submit Get-Service as a job and wait for the job to finish. By setting a timeout on the job, if it fails to complete the return will be null. Do whatever error handling you need to if the value is null, or receive the job and drop the result in your $service variable if it completed. This will return a Deserialized.System.ServiceProcess.ServiceController object. Adjust -Timeout on Wait-Job to fit your needs.