Actualmente estoy escribiendo un script de implementación que instala varios servicios de Windows.
Los nombres de los servicios están versionados, por lo que quiero eliminar la versión anterior del servicio de Windows como parte de las instalaciones del nuevo servicio.
¿Cómo puedo hacer esto mejor en PowerShell?
powershell
windows-services
Adrian Russell
fuente
fuente
$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
No hay ningún daño en usar la herramienta adecuada para el trabajo, creo que se ejecuta (desde Powershell)
El método más confiable que no tiene muchas dependencias.
fuente
.exe
hasta que vi tu comentario. Ahora está funcionando para mí.\\server
) simplemente se omite si el servicio es local.%
y$_
Si solo desea verificar la existencia del servicio:
fuente
Usé la solución "-ErrorAction SilentlyContinue" pero luego me encontré con el problema de que deja un ErrorRecord atrás. Así que aquí hay otra solución para simplemente verificar si el Servicio existe usando "Get-Service".
Pero ravikanth tiene la mejor solución ya que Get-WmiObject no arrojará un error si el Servicio no existiera. Así que decidí usar:
Para ofrecer una solución más completa:
fuente
Get-WmiObject -Class Win32_Service -Filter "Name='$serviceName'"
yGet-Service $serviceName -ErrorAction Ignore
(que oculta completamente el error si el servicio no existe) para completar. Esperaba que el Get-WmiObject pudiera ser más rápido porque no arroja un error. Estaba muy equivocado Ejecutando cada uno en un bucle 100 veces, Get-Service tomó 0,16 segundos, mientras que Get-WmiObject tardó 9,66 segundos. Entonces Get-Service es 60 veces más rápido que Get-WmiObject.Las versiones más recientes de PS tienen Remove-WmiObject. Cuidado con las fallas silenciosas para $ service.delete () ...
Para mi situación, necesitaba ejecutar 'Como administrador'
fuente
Para eliminar varios servicios en Powershell 5.0, ya que el servicio de eliminación no existe en esta versión
Ejecute el siguiente comando
fuente
Combinando las respuestas de Dmitri y dcx hice esto:
fuente
Uno podría usar Where-Object
if ((Get-Service | Where-Object {$_.Name -eq $serviceName}).length -eq 1) { "Service Exists" }
fuente
Para verificar si
MySuperServiceVersion1
existe un servicio de Windows con nombre , incluso cuando no esté seguro de su nombre exacto, puede emplear un comodín, usando una subcadena como esta:fuente
Para una sola PC:
Macro para la lista de PC:
fuente
PowerShell Core ( v6 + ) ahora tiene un
Remove-Service
cmdlet .No sé acerca de los planes de back-portarlo a de Windows PowerShell, donde es no disponible a partir de la versión 5.1.
Ejemplo:
Tenga en cuenta que la invocación falla si el servicio no existe, por lo que para eliminarlo solo si actualmente existe, puede hacer lo siguiente:
fuente
Para las versiones de PowerShell anteriores a v6, puede hacer esto:
Para v6 +, puede usar el cmdlet Remove-Service .
Observe que a partir de Windows PowerShell 3.0, el cmdlet Get-WmiObject ha sido reemplazado por Get-CimInstance.
fuente
Adaptado esto para tomar una lista de entrada de servidores, especificar un nombre de host y dar una salida útil
fuente
Windows Powershell 6 tendrá el cmdlet Remove-Service . A partir de ahora, la versión de Github muestra PS v6 beta-9
Fuente: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-service?view=powershell-6
fuente