Ich schreibe derzeit ein Bereitstellungsskript, das eine Reihe von Windows-Diensten installiert.
Die Dienstnamen sind versioniert, daher möchte ich die vorherige Windows-Dienstversion im Rahmen der Installation des neuen Dienstes löschen.
Wie kann ich dies am besten in PowerShell tun?
powershell
windows-services
Adrian Russell
quelle
quelle
$service = Get-WmiObject -Class Win32_Service -Filter "Name='servicename'"
$service | Remove-WmiObject
$service.delete()
Stop-Service 'servicename'; Get-CimInstance -ClassName Win32_Service -Filter "Name='servicename'" | Remove-CimInstance
Es schadet nicht, das richtige Werkzeug für den Job zu verwenden. Ich finde, es läuft (von Powershell)
Die zuverlässigste Methode, die nicht viele Abhängigkeiten aufweist.
quelle
.exe
bis ich deinen Kommentar sah. Jetzt funktioniert es für mich.\\server
) wird einfach weggelassen, wenn der Dienst lokal ist.%
und$_
Wenn Sie nur die Existenz des Dienstes überprüfen möchten:
quelle
Ich habe die Lösung "-ErrorAction SilentlyContinue" verwendet, bin dann aber später auf das Problem gestoßen, dass ein ErrorRecord zurückbleibt. Hier ist eine weitere Lösung, um mithilfe von "Get-Service" zu überprüfen, ob der Service vorhanden ist.
Aber Ravikanth hat die beste Lösung, da das Get-WmiObject keinen Fehler auslöst, wenn der Service nicht existiert. Also entschied ich mich für:
Um eine vollständigere Lösung anzubieten:
quelle
Get-WmiObject -Class Win32_Service -Filter "Name='$serviceName'"
und entschiedenGet-Service $serviceName -ErrorAction Ignore
(der den Fehler vollständig verbirgt, wenn der Dienst nicht vorhanden ist). Ich habe erwartet, dass das Get-WmiObject möglicherweise schneller ist, da es keinen Fehler auslöst. Ich habe mich sehr geirrt Get-Service wurde jeweils 100 Mal in einer Schleife ausgeführt und dauerte 0,16 Sekunden, während Get-WmiObject 9,66 Sekunden dauerte. Get-Service ist also 60x schneller als Get-WmiObject.Neuere Versionen von PS haben Remove-WmiObject. Vorsicht vor stillen Fehlern für $ service.delete () ...
Für meine Situation musste ich "Als Administrator" ausführen.
quelle
So löschen Sie mehrere Dienste in Powershell 5.0, da der Dienst zum Entfernen in dieser Version nicht vorhanden ist
Führen Sie den folgenden Befehl aus
quelle
Ich kombinierte die Antworten von Dmitri & dcx und machte Folgendes:
quelle
Man könnte Where-Object verwenden
if ((Get-Service | Where-Object {$_.Name -eq $serviceName}).length -eq 1) { "Service Exists" }
quelle
Um zu überprüfen, ob ein Windows-Dienst mit dem Namen
MySuperServiceVersion1
vorhanden ist, können Sie einen Platzhalter verwenden, indem Sie einen Teilstring wie den folgenden verwenden:quelle
Für einen einzelnen PC:
Makro für Liste der PCs:
quelle
PowerShell Core ( v6 + ) verfügt jetzt über ein
Remove-Service
Cmdlet .Ich weiß nichts über Pläne, es auf Windows PowerShell zurück zu portieren , wo es ab Version 5.1 nicht verfügbar ist.
Beispiel:
Beachten Sie, dass der Aufruf fehlschlägt, wenn der Dienst nicht vorhanden ist. Um ihn also nur zu entfernen, wenn er derzeit vorhanden ist, können Sie Folgendes tun:
quelle
Für PowerShell-Versionen vor Version 6 können Sie Folgendes tun:
Für Version 6 + können Sie das Cmdlet Remove-Service verwenden .
Beachten Sie, dass ab Cmdlet Get-WmiObject ab Windows PowerShell 3.0 Get-CimInstance ersetzt wurde.
quelle
Dies wurde angepasst, um eine Eingabeliste mit Servern zu erstellen, einen Hostnamen anzugeben und hilfreiche Ausgaben zu liefern
quelle
Windows Powershell 6 verfügt über das Cmdlet Remove-Service . Ab sofort zeigt die Github-Version PS v6 Beta-9
Quelle: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-service?view=powershell-6
quelle