Благодаря взносам каждого на этот вопрос, я придумал следующий сценарий. Измените значения для $SvcName
и $SvrName
в соответствии с вашими потребностями. Этот скрипт запустит удаленный сервис, если он остановлен, или остановите его, если он запущен. И он использует классный метод .WaitForStatus
для ожидания ответа службы.
#Change this values to suit your needs:
$SvcName = 'Spooler'
$SvrName = 'remotePC'
#Initialize variables:
[string]$WaitForIt = ""
[string]$Verb = ""
[string]$Result = "FAILED"
$svc = (get-service -computername $SvrName -name $SvcName)
Write-host "$SvcName on $SvrName is $($svc.status)"
Switch ($svc.status) {
'Stopped' {
Write-host "Starting $SvcName..."
$Verb = "start"
$WaitForIt = 'Running'
$svc.Start()}
'Running' {
Write-host "Stopping $SvcName..."
$Verb = "stop"
$WaitForIt = 'Stopped'
$svc.Stop()}
Default {
Write-host "$SvcName is $($svc.status). Taking no action."}
}
if ($WaitForIt -ne "") {
Try { # For some reason, we cannot use -ErrorAction after the next statement:
$svc.WaitForStatus($WaitForIt,'00:02:00')
} Catch {
Write-host "After waiting for 2 minutes, $SvcName failed to $Verb."
}
$svc = (get-service -computername $SvrName -name $SvcName)
if ($svc.status -eq $WaitForIt) {$Result = 'SUCCESS'}
Write-host "$Result`: $SvcName on $SvrName is $($svc.status)"
}
Конечно, счет запуска этого под потребуются соответствующие права доступа к удаленному компьютеру и запускать и останавливать службы. И, выполняя это на старых удаленных компьютерах, сначала вам нужно установить WinRM 3.0 на более старую машину.
Примечание. Протестирован этот метод, и он выполняет вызов удаленного хоста, но не дожидался прекращения службы перед продолжением сценария. Если вы сделаете Stop() и Start(), Start() скорее всего потерпит неудачу, потому что Служба еще не остановлена. Просто FYI, если вы хотите сделать больше, чем Stop в своем скрипте (что выходит за рамки того, что задал этот вопрос) –
Просто вопрос с полномочиями, я думаю: возможно ли это сделать из командного файла, например, поместить несколько строк для нескольких машин после друг друга (например .bat) – Hace
В новых версиях (3+?) Powershell вы можете получить эту услугу, а затем использовать ее метод '' .WaitForStatus' (http://www.powershellmagazine.com/2013/04/10/pstip-wait-for-a-service-to-reach-a-defined-status /) – Baodad