Obecnie piszę skrypt wdrażania, który instaluje szereg usług systemu Windows.
Nazwy usług są wersjonowane, dlatego chcę usunąć poprzednią wersję usługi systemu Windows w ramach instalacji nowej usługi.
Jak najlepiej to zrobić w PowerShell?
powershell
windows-services
Adrian Russell
źródło
źródło
$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
Nie ma nic złego w używaniu odpowiedniego narzędzia do pracy, uważam, że działa (z Powershell)
najbardziej niezawodna metoda, która nie ma wielu zależności.
źródło
.exe
komentarz, dopóki nie zobaczyłem twojego komentarza. Teraz to działa dla mnie.\\server
) jest po prostu pomijana, jeśli usługa jest lokalna.%
i$_
Jeśli chcesz tylko sprawdzić istnienie usługi:
źródło
Użyłem rozwiązania „-ErrorAction SilentlyContinue”, ale później napotkałem problem polegający na tym, że pozostawia za sobą ErrorRecord. Oto kolejne rozwiązanie pozwalające po prostu sprawdzić, czy Usługa istnieje, za pomocą funkcji „Get-Service”.
Ale ravikanth ma najlepsze rozwiązanie, ponieważ Get-WmiObject nie zgłosi błędu, jeśli usługa nie istnieje. Więc zdecydowałem się na użycie:
Aby zaoferować bardziej kompletne rozwiązanie:
źródło
Get-WmiObject -Class Win32_Service -Filter "Name='$serviceName'"
iGet-Service $serviceName -ErrorAction Ignore
(co całkowicie ukrywa błąd, jeśli usługa nie istnieje) dla kompletności. Spodziewałem się, że Get-WmiObject może być szybszy, ponieważ nie zgłasza błędu. Bardzo się myliłem. Uruchomienie każdego w pętli 100 razy, Get-Service zajęło 0,16 sekundy, a Get-WmiObject 9,66 sekundy. Więc Get-Service jest 60x szybszy niż Get-WmiObject.Nowsze wersje PS mają Remove-WmiObject. Uważaj na ciche niepowodzenia $ service.delete () ...
W mojej sytuacji potrzebowałem uruchomić „Jako administrator”
źródło
Aby usunąć wiele usług w programie PowerShell 5.0, ponieważ usługa usuwania nie istnieje w tej wersji
Uruchom poniższe polecenie
źródło
Łącząc odpowiedzi Dmitri i dcx, zrobiłem to:
źródło
Można by użyć Where-Object
if ((Get-Service | Where-Object {$_.Name -eq $serviceName}).length -eq 1) { "Service Exists" }
źródło
Aby sprawdzić, czy usługa Windows o nazwie
MySuperServiceVersion1
istnieje, nawet jeśli nie jesteś pewien jej dokładnej nazwy, możesz użyć symbolu wieloznacznego, używając podłańcucha takiego jak ten:źródło
Dla jednego komputera:
Makro do listy komputerów:
źródło
PowerShell Core ( v6 + ) ma teraz polecenie
Remove-Service
cmdlet .Nie wiem o planach back-portu go do systemu Windows PowerShell, gdzie jest nie dostępna od v5.1.
Przykład:
Pamiętaj, że wywołanie kończy się niepowodzeniem, jeśli usługa nie istnieje, więc aby usunąć ją tylko wtedy, gdy obecnie istnieje, możesz wykonać:
źródło
W przypadku wersji programu PowerShell wcześniejszych niż wersja 6 można to zrobić:
W przypadku wersji 6+ można użyć polecenia cmdlet Remove-Service .
Zwróć uwagę, że począwszy od programu Windows PowerShell 3,0, polecenie cmdlet Get-WmiObject zostało zastąpione przez Get-CimInstance.
źródło
Zaadaptowano to, aby pobrać listę wejściową serwerów, określić nazwę hosta i podać pomocne wyniki
źródło
Windows Powershell 6 będzie miał cmdlet Remove-Service . Jak na razie wydanie Github pokazuje PS v6 beta-9
Źródło: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-service?view=powershell-6
źródło