danielbodensee
Goto Top

Services aus einem Array auslesen dann stückweise stoppen

Hallo zusammen,

ich muss mir eine Funktion schreiben der ich ein Array von zu stoppenden Services übergeben kann. Innerhalb der Funktion möchte ich die Servcies stoppen (wenn möglich) und darauf warten bis der Service den Status stop erreicht hat.

Im Grunde würde ich dann ein True or False zurückgeben (ob alles ohne Fehler lief) und evtl ein Array worin die nicht zu stoppenden Services zurück gegeben werden.

In VisualBasic (meine Heimat) kein Problem, aber ich möchte es per Powershell lösen, ich bin der Meinung das dürfte besser weil auch für Kollegen lesbar sein.

Aber mir geht der Knopf nicht auf wie ich das unter PS (sicher) machen kann.


Viele Grüsse,
Daniel

Content-Key: 231985

Url: https://administrator.de/contentid/231985

Ausgedruckt am: 29.03.2024 um 05:03 Uhr

Mitglied: colinardo
colinardo 07.03.2014 aktualisiert um 15:43:26 Uhr
Goto Top
Hallo Daniel,
etwa so:
function Stop-Services([string[]]$services,[int]$maxWaitSeconds = 120){
    $arrFehler = @()
    foreach($service in $services){
        $svc = Get-Service $service -ErrorAction SilentlyContinue
        if ($svc){
            if ($svc.Status -ne 'Stopped'){  
                if ($svc.CanStop){
                    $svc.Stop()
                    $svc.WaitForStatus('Stopped',[TimeSpan]::FromSeconds($maxWaitSeconds))  
                    if ($svc.Status -ne 'Stopped'){  
                        $arrFehler += "Dienst '$service' konnte nicht gestoppt werden"  
                    }
                }else{
                    $arrFehler += "Dienst '$service' darf nicht gestoppt werden (nicht erlaubt)"  
                }
            }
        }else{
            $arrFehler += "Dienst '$service' existiert nicht"  
        }
    }
    if ($arrFehler.Count -gt 0){
        $arrFehler
    }else{
        $true
    }

} #End Function

# Dienste an Funktion übergeben
$result = Stop-Services -services @("Dienst1","Dienst2","Dienst3") -maxWaitSeconds 60  

# Resultat abfragen
if ($result -eq $true){
    write-host "Keine Fehler aufgetreten" -ForegroundColor Green  
}else{
    write-host "Fehler:" -ForegroundColor Red  
    write-host $result -ForegroundColor Yellow
}
Grüße Uwe
Mitglied: DanielBodensee
DanielBodensee 07.03.2014 um 14:46:16 Uhr
Goto Top
Hallo Uwe,

super, vielen Dank, das sieht sehr gut aus und ich baue es gerade als Funktion aus.

Eine Frage habe ich noch...
Da ich diese Funktion wiederverwendbar machen will, möchte ich ein TimeOut als Parameter definieren. Wie kann ich eigentlich die Sekunden (z.Bsp. 120) in die Zeitangabe für WaitForStatus umsetzen? Als Variable habe ich [int] vorgesehen, aber ich brauche ja das Format xx:xx:xx?

Ich denke es macht auch sinn abzufragen ob der Dienst überhaupt gestoppt werden kann?

Viele Grüsse,
Daniel
Mitglied: colinardo
colinardo 07.03.2014 aktualisiert um 15:41:34 Uhr
Goto Top
Zitat von @DanielBodensee:
Eine Frage habe ich noch...
Da ich diese Funktion wiederverwendbar machen will, möchte ich ein TimeOut als Parameter definieren. Wie kann ich eigentlich
die Sekunden (z.Bsp. 120) in die Zeitangabe für WaitForStatus umsetzen? Als Variable habe ich [int] vorgesehen, aber ich
brauche ja das Format xx:xx:xx?
Das was dort als Parameter eingefügt werden muss ist ein TimeSpan-Objekt
So kannst du Sekunden für den Parameter verwenden
[Timespan]::FromSeconds(10)
[-edit- oben ergänzt]

Ich denke es macht auch sinn abzufragen ob der Dienst überhaupt gestoppt werden kann?
Ja das hatte ich noch nicht berücksichtigt... [- edit - oben eingefügt]
Mitglied: DanielBodensee
DanielBodensee 07.03.2014 um 17:16:59 Uhr
Goto Top
Hallo Uwe,

super, tausend Dank, das klappt perfekt face-smile

Viele Grüsse,
Daniel