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にはサービスを停止、開始、一時停止する機能のみがあり、サービスを同時に再起動することはできません。
何か案は?私は完全に明白な何かを見逃しているかもしれません。
サービスを再起動するには、単に 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()
}
私はアンスガーと一緒です、これはうまくいくはずです
$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ドキュメントをインポートすると、各サービスと各コンピューターで処理され、サービスが再起動されます。
次の単一のライナーコマンドを試すことができます。
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()}