web-dev-qa-db-ja.com

Set-Serviceを使用してサービスをリモートで停止および再起動する

6つのサーバーで定期的に再起動する必要がある10〜15のサービスのリストがあります。サービスのリストを呼び出し、サーバーのリストを呼び出し、すべてのサービスを停止するスクリプトがあります。

$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にはサービスを停止、開始、一時停止する機能のみがあり、サービスを同時に再起動することはできません。

何か案は?私は完全に明白な何かを見逃しているかもしれません。

7
PJC83

サービスを再起動するには、単に 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 ' or '
Get-WmiObject Win32_Service -Computer $Machines -Filter $fltr | ForEach-Object {
    $_.StopService()
    $_.StartService()
}
9
Ansgar Wiechers

私はアンスガーと一緒です、これはうまくいくはずです

$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ドキュメントをインポートすると、各サービスと各コンピューターで処理され、サービスが再起動されます。

2
Luke

次の単一のライナーコマンドを試すことができます。

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()}
0
SavindraSingh