web-dev-qa-db-fra.com

Arrêt et redémarrage de services à distance à l'aide de Set-Service

J'ai une liste de 10 à 15 services que je dois régulièrement redémarrer sur 6 serveurs. J'ai un script qui appelle une liste de services, puis une liste de serveurs, puis arrête tous les services:

$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

J'ai ensuite un autre script séparé pour les relancer:

$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

J'ai vérifié et je n'arrive pas à trouver un moyen de mettre cela dans un seul script. Si j'ai bien compris, Set-Service ne peut qu'arrêter, démarrer et suspendre des services, pas les redémarrer en même temps.

Des idées? Il se peut que je manque quelque chose de complètement évident.

6
PJC83

Pour redémarrer les services, utilisez simplement 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

Dans la mesure où, selon les commentaires, PowerShell v6 a supprimé la prise en charge de l'accès distant des cmdlets *-Service, vous devez recourir à Invoke-Command pour l'exécution à distance lors de l'exécution de la version 6 ou plus récente:

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

Je suis avec Ansgar, ça devrait marcher

$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}
    }
}

c'est un peu en désordre mais devrait vous donner un point de départ

Désolé, j'ai oublié de prendre le temps de vous expliquer ce qui se passe. Vous devez donc importer chacun de vos documents texte, puis le traiter pour chaque service et chaque ordinateur, puis le redémarrer.

2
Luke

Vous pouvez essayer cette commande à une ligne:

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