No momento, estou escrevendo um script de implantação que instala vários serviços do Windows.
Os nomes dos serviços são versionados, portanto, desejo excluir a versão anterior do serviço do Windows como parte das instalações do novo serviço.
Como posso fazer isso da melhor maneira no PowerShell?
powershell
windows-services
Adrian Russell
fonte
fonte
$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
Não há mal nenhum em usar a ferramenta certa para o trabalho, acho que estou executando (da Powershell)
o método mais confiável que não possui muitas dependências.
fonte
.exe
até ver seu comentário. Agora está funcionando para mim.\\server
) é simplesmente omitido se o serviço for local.%
e$_
Se você deseja apenas verificar a existência do serviço:
fonte
Usei a solução "-ErrorAction SilentlyContinue", mas depois deparei com o problema de deixar um ErrorRecord para trás. Então, aqui está outra solução para verificar se o Serviço existe usando "Get-Service".
Mas o ravikanth tem a melhor solução, pois o Get-WmiObject não gera um erro se o Serviço não existir. Então, decidi usar:
Então, para oferecer uma solução mais completa:
fonte
Get-WmiObject -Class Win32_Service -Filter "Name='$serviceName'"
eGet-Service $serviceName -ErrorAction Ignore
(que oculta completamente o erro se o serviço não existir) para garantir a integridade. Eu esperava que o Get-WmiObject fosse mais rápido porque não gera um erro. Eu estava muito errado. Executando cada um em um loop 100 vezes, o Get-Service levou 0,16 segundos, enquanto o Get-WmiObject levou 9,66 segundos. Portanto, o Get-Service é 60x mais rápido que o Get-WmiObject.Versões mais recentes do PS têm o Remove-WmiObject. Cuidado com falhas silenciosas para $ service.delete () ...
Para minha situação, eu precisava estar executando 'Como administrador'
fonte
Para excluir vários serviços no Powershell 5.0, pois o serviço de remoção não existe nesta versão
Execute o comando abaixo
fonte
Combinando as respostas de Dmitri e dcx, fiz o seguinte:
fonte
Pode-se usar Where-Object
if ((Get-Service | Where-Object {$_.Name -eq $serviceName}).length -eq 1) { "Service Exists" }
fonte
Para verificar se
MySuperServiceVersion1
existe um serviço do Windows nomeado , mesmo quando você não tiver certeza do nome exato, você pode empregar um curinga, usando uma substring como:fonte
Para um único PC:
Macro para lista de PCs:
fonte
O PowerShell Core ( v6 + ) agora tem um
Remove-Service
cmdlet .Eu não sei sobre os planos para voltar porta-lo para o Windows PowerShell, onde é não disponível a partir de v5.1.
Exemplo:
Observe que a chamada falha se o serviço não existir; portanto, para removê-lo apenas se ele existir atualmente, você pode:
fonte
Para versões do PowerShell anteriores à v6, você pode fazer o seguinte:
Para v6 +, você pode usar o cmdlet Remove-Service .
Observe que, a partir do Windows PowerShell 3.0, o cmdlet Get-WmiObject foi substituído pelo Get-CimInstance.
fonte
Adaptado para obter uma lista de entrada de servidores, especificar um nome de host e fornecer uma saída útil
fonte
O Windows Powershell 6 terá o cmdlet Remove-Service . A partir de agora, o lançamento do Github mostra o PS v6 beta-9
Fonte: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-service?view=powershell-6
fonte