Вопрос:

Остановка и перезапуск служб удаленно с помощью Set-Service

powershell service

47587 просмотра

3 ответа

68 Репутация автора

У меня есть список из 10-15 сервисов, которые мне обычно нужно перезапускать на 6 серверах. У меня есть скрипт, который вызывает список служб, затем вызывает список серверов, а затем останавливает все службы:

$Services = Get-Content -Path "C:\Powershell\Services.txt"
$Machines = Get-Content -Path "C:\Powershell\Machines.txt"
Get-Service -Name $Services -ComputerName $Machines | Set-Service -Status Stopped

Затем у меня есть другой отдельный скрипт, чтобы запустить их снова:

$Services = Get-Content -Path "C:\Powershell\Services.txt"
$Machines = Get-Content -Path "C:\Powershell\Machines.txt"
Get-Service -Name $Services -ComputerName $Machines | Set-Service -Status Running

Я проверил и не могу найти способ поместить это в один скрипт. Как я понимаю, Set-Service имеет возможность только останавливать, запускать и останавливать службы, но не перезапускать их одновременно.

Есть идеи? Я мог бы упустить что-то совершенно очевидное.

Автор: PJC83 Источник Размещён: 31.07.2015 03:26

Ответы (3)


0 плюса

296 Репутация автора

Вы можете попробовать эту команду с одним вкладышем:

Get-Content .\services.txt | %{Get-WmiObject -Class Win32_Service -ComputerName (Get-Content .\computers.txt) -Filter "Name='$_'"} | %{$_.StopService()}; Get-Content .\services.txt | %{Get-WmiObject -Class Win32_Service -ComputerName (Get-Content .\computers.txt) -Filter "Name='$_'"} | %{$_.StartService()}
Автор: SavindraSingh Размещён: 31.07.2015 03:57

2 плюса

489 Репутация автора

Я с Ансгаром, это должно работать

$Services = Get-Content -Path "C:\Powershell\Services.txt"
$Machines = Get-Content -Path "C:\Powershell\Machines.txt"
foreach ($service in $services){
    foreach ($computer in $Machines){
    Invoke-Command -ComputerName $computer -ScriptBlock{
    Restart-Service -DisplayName $service}
    }
}

это немного грязно, но должно дать вам отправную точку

Извините, я забыл выделить время, чтобы объяснить, что происходит, поэтому вы импортируете каждый из ваших документов TXT, а затем он будет обрабатывать для каждой службы и каждого компьютера и перезапускать службы.

Автор: Luke Размещён: 31.07.2015 04:00

7 плюса

148850 Репутация автора

Решение

Для перезапуска сервисов просто используйте Restart-Service:

$Services = Get-Content -Path "C:\Powershell\Services.txt"
$Machines = Get-Content -Path "C:\Powershell\Machines.txt"
Get-Service -Name $Services -ComputerName $Machines | Restart-Service

Так как согласно комментариям PowerShell v6 удалил поддержку удаленного доступа из *-Serviceкомандлетов, к которым нужно прибегать Invoke-Commandдля удаленного выполнения при запуске v6 или новее, например так:

Invoke-Command -Computer $Machines -ScriptBlock {
    Get-Service -Name $using:Services -ErrorAction SilentlyContinue |
        Restart-Service
}

или вот так:

Invoke-Command -Computer $Machines -ScriptBlock {
    Restart-Service $using:Services -ErrorAction SilentlyContinue
}

Другой вариант будет WMI:

$fltr = ($Services | ForEach-Object { 'Name="{0}"' -f $_ }) -join ' '
Get-WmiObject Win32_Service -Computer $Machines -Filter $fltr | ForEach-Object {
    $_.StopService()
    $_.StartService()
}
Автор: Ansgar Wiechers Размещён: 31.07.2015 04:00
Вопросы из категории :
32x32