start script español powershell windows-services

script - powershell start service



Compruebe si existe un servicio de Windows y elimínelo en PowerShell (14)

Actualmente estoy escribiendo una secuencia de comandos 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?


Combinando las respuestas de Dmitri y dcx, hice esto:

function Confirm-WindowsServiceExists($name) { if (Get-Service $name -ErrorAction SilentlyContinue) { return $true } return $false } function Remove-WindowsServiceIfItExists($name) { $exists = Confirm-WindowsServiceExists $name if ($exists) { sc.exe //server delete $name } }


Debe usar WMI para esto ya que no hay ningún cmdlet Remove-Service

Por ejemplo,

$service = Get-WmiObject -Class Win32_Service -Filter "Name=''servicename''" $service.delete()


Las versiones más recientes de PS tienen Remove-WmiObject. Tenga cuidado con los silenciosos fallos de $ service.delete () ...

PS D:/> $s3=Get-WmiObject -Class Win32_Service -Filter "Name=''TSATSvrSvc03''" PS D:/> $s3.delete() ... ReturnValue : 2 ... PS D:/> $? True PS D:/> $LASTEXITCODE 0 PS D:/> $result=$s3.delete() PS D:/> $result.ReturnValue 2 PS D:/> Remove-WmiObject -InputObject $s3 Remove-WmiObject : Access denied At line:1 char:1 + Remove-WmiObject -InputObject $s3 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Remove-WmiObject], ManagementException + FullyQualifiedErrorId : RemoveWMIManagementException,Microsoft.PowerShell.Commands.RemoveWmiObject PS D:/>

Para mi situación, necesitaba ejecutar ''Como administrador''


No hay nada malo en usar la herramienta adecuada para el trabajo, me parece correr (de Powershell)

sc.exe //server delete "MyService"

el método más confiable que no tiene muchas dependencias.


Para comprobar si existe un servicio de Windows llamado MySuperServiceVersion1 , incluso cuando no esté seguro de su nombre exacto, puede emplear un comodín, utilizando una subcadena de la siguiente manera:

if (Get-Service -Name "*SuperService*" -ErrorAction SilentlyContinue) { # do something }


Para eliminar servicios múltiples en Powershell 5.0, ya que el servicio de eliminación no existe en esta versión

Ejecute el comando debajo

Get-Service -Displayname "*ServiceName*" | ForEach-object{ cmd /c sc delete $_.Name}


Para una sola PC:

if (Get-Service "service_name" -ErrorAction ''SilentlyContinue''){(Get-WmiObject -Class Win32_Service -filter "Name=''service_name''").delete()} else{write-host "No service found."}

Macro para la lista de PC:

$name = "service_name" $list = get-content list.txt foreach ($server in $list) { if (Get-Service "service_name" -computername $server -ErrorAction ''SilentlyContinue''){ (Get-WmiObject -Class Win32_Service -filter "Name=''service_name''" -ComputerName $server).delete()} else{write-host "No service $name found on $server."} }


Se adaptó esto para tomar una lista de entrada de servidores, especificar un nombre de host y dar algunos resultados útiles

$name = "<ServiceName>" $servers = Get-content servers.txt function Confirm-WindowsServiceExists($name) { if (Get-Service -Name $name -Computername $server -ErrorAction Continue) { Write-Host "$name Exists on $server" return $true } Write-Host "$name does not exist on $server" return $false } function Remove-WindowsServiceIfItExists($name) { $exists = Confirm-WindowsServiceExists $name if ($exists) { Write-host "Removing Service $name from $server" sc.exe //$server delete $name } } ForEach ($server in $servers) {Remove-WindowsServiceIfItExists($name)}


Si solo quieres verificar la existencia del servicio:

if (Get-Service "My Service" -ErrorAction SilentlyContinue) { "service exists" }


Uno podría usar Where-Object

if ((Get-Service | Where-Object {$_.Name -eq $serviceName}).length -eq 1) { "Service Exists" }


Usé la solución "-ErrorAction SilentlyContinue" pero luego me encontré con el problema de que deja un ErrorRecord detrás. Así que aquí hay otra solución para simplemente verificar si el Servicio existe usando "Get-Service".

# Determines if a Service exists with a name as defined in $ServiceName. # Returns a boolean $True or $False. Function ServiceExists([string] $ServiceName) { [bool] $Return = $False # If you use just "Get-Service $ServiceName", it will return an error if # the service didn''t exist. Trick Get-Service to return an array of # Services, but only if the name exactly matches the $ServiceName. # This way you can test if the array is emply. if ( Get-Service "$ServiceName*" -Include $ServiceName ) { $Return = $True } Return $Return } [bool] $thisServiceExists = ServiceExists "A Service Name" $thisServiceExists

Pero ravikanth tiene la mejor solución ya que Get-WmiObject no arrojará un error si el servicio no existiera. Así que me decidí a usar:

Function ServiceExists([string] $ServiceName) { [bool] $Return = $False if ( Get-WmiObject -Class Win32_Service -Filter "Name=''$ServiceName''" ) { $Return = $True } Return $Return }

Para ofrecer una solución más completa:

# Deletes a Service with a name as defined in $ServiceName. # Returns a boolean $True or $False. $True if the Service didn''t exist or was # successfully deleted after execution. Function DeleteService([string] $ServiceName) { [bool] $Return = $False $Service = Get-WmiObject -Class Win32_Service -Filter "Name=''$ServiceName''" if ( $Service ) { $Service.Delete() if ( -Not ( ServiceExists $ServiceName ) ) { $Return = $True } } else { $Return = $True } Return $Return }



PowerShell Core ( v6 + ) ahora tiene un https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-service?view=powershell-6 .

No sé sobre los planes para realizar una copia de seguridad de puerto a Windows PowerShell, donde no está disponible a partir de v5.1.

Ejemplo:

# PowerShell *Core* only (v6+) Remove-Service someservice

Tenga en cuenta que la invocación falla si el servicio no existe, por lo que para eliminarlo solo si ya existe, podría hacer lo siguiente:

# PowerShell *Core* only (v6+) $name = ''someservice'' if (Get-Service $name -ErrorAction Ignore) { Remove-Service $name }