Windows 서비스가 있는지 확인하고 PowerShell에서 삭제
현재 여러 윈도우즈 서비스를 설치하는 배포 스크립트를 작성하고 있습니다.
서비스 이름이 버전이 지정되었으므로 새 서비스를 설치하는 과정에서 이전 Windows 서비스 버전을 삭제하려고 합니다.
PowerShell에서 이 작업을 가장 잘 수행하는 방법은 무엇입니까?
WMI 또는 다른 도구는 사용할 수 없습니다.Remove-Service
Powershell 6.0까지 cmdlet(서비스 문서 제거 참조)
예:
$service = Get-WmiObject -Class Win32_Service -Filter "Name='servicename'"
$service.delete()
아니면 그와 함께.sc.exe
도구:
sc.exe delete ServiceName
마지막으로 PowerShell 6.0에 액세스할 수 있는 경우:
Remove-Service -Name ServiceName
작업에 적합한 도구를 사용하는 것이 나쁠 것이 없습니다. 저는 우리의 사인을 찾습니다.sc.exe
(PowerShell을 통해) 종속성이 거의 없는 가장 안정적인 방법입니다.
로컬:
sc.exe delete "MyService"
원격 서버:
sc.exe \\server delete "MyService"
서비스 존재 여부만 확인하려는 경우:
if (Get-Service "My Service" -ErrorAction SilentlyContinue)
{
"service exists"
}
"-ErrorAction SilentContinue" 솔루션을 사용했지만 나중에 오류 레코드가 남아 있다는 문제가 발생했습니다.여기 "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
그러나 서비스가 존재하지 않는 경우 Get-WmiObject는 오류를 발생시키지 않기 때문에 Ravikanth가 가장 좋은 해결책을 가지고 있습니다.그래서 저는 다음을 사용하기로 결정했습니다.
Function ServiceExists([string] $ServiceName) {
[bool] $Return = $False
if ( Get-WmiObject -Class Win32_Service -Filter "Name='$ServiceName'" ) {
$Return = $True
}
Return $Return
}
보다 완벽한 솔루션을 제공하기 위해:
# 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
}
최신 버전의 PS에는 Remove-WmiObject가 있습니다.$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:\>
이러한 상황에서 '관리자 권한'을 실행해야 했습니다.
제거 서비스가 이 버전에 없으므로 Powershell 5.0에서 여러 서비스를 삭제하려면
다음 명령을 실행합니다.
Get-Service -Displayname "*ServiceName*" | ForEach-object{ cmd /c sc delete $_.Name}
Where-Object를 사용할 수 있습니다.
if ((Get-Service | Where-Object {$_.Name -eq $serviceName}).length -eq 1) { "Service Exists" }
드미트리 & dcx의 답변을 종합하여 저는 다음과 같이 만들었습니다.
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
}
}
단일 PC의 경우:
if (Get-Service "service_name" -ErrorAction 'SilentlyContinue'){(Get-WmiObject -Class Win32_Service -filter "Name='service_name'").delete()}
else{write-host "No service found."}
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."}
}
이름이 지정된 Windows 서비스를 확인하려면 다음과 같이 하십시오.MySuperServiceVersion1
정확한 이름을 모를 경우에도 다음과 같은 하위 문자열을 사용하여 와일드카드를 사용할 수 있습니다.
if (Get-Service -Name "*SuperService*" -ErrorAction SilentlyContinue)
{
# do something
}
이제 PowerShell Core(v6+)에 cmdlet이 있습니다.
v5.1 이후로는 사용할 수 없는 Windows PowerShell로 백포트할 계획이 있는지 모르겠습니다.
예:
# PowerShell *Core* only (v6+)
Remove-Service someservice
서비스가 존재하지 않으면 호출이 실패하므로 현재 서비스가 존재하는 경우에만 호출을 제거하려면 다음 작업을 수행할 수 있습니다.
# PowerShell *Core* only (v6+)
$name = 'someservice'
if (Get-Service $name -ErrorAction Ignore) {
Remove-Service $name
}
서버의 입력 목록을 가져오고 호스트 이름을 지정하고 유용한 출력을 제공하도록 조정했습니다.
$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)}
v6 이전 버전의 PowerShell에서는 다음을 수행할 수 있습니다.
Stop-Service 'YourServiceName'; Get-CimInstance -ClassName Win32_Service -Filter "Name='YourServiceName'" | Remove-CimInstance
v6+의 경우 Remove-Service cmdlet을 사용할 수 있습니다.
윈도우즈 PowerShell 3.0부터는 cmdlet Get-WmiObject가 Get-CimInstance로 대체되었습니다.
윈도우즈 Powershell 6에는 Remove-Service cmdlet이 있습니다.현재 Github 릴리스에는 PS v6 베타-9가 표시됩니다.
오래된 질문인 것은 알지만 누군가가 한 줄기 선을 찾고 있다면:
PS 버전 > 7.2에서
이름 속성에 대한 와일드카드 검색
Get-Service *name* | Select-Object -First 1 | Remove-Service
표시 이름 속성 검색
Get-Service -DisplayName "My Service Description" | Remove-Service
언급URL : https://stackoverflow.com/questions/4967496/check-if-a-windows-service-exists-and-delete-in-powershell
'it-source' 카테고리의 다른 글
날짜 시간 대신 날짜? (0) | 2023.05.11 |
---|---|
기존의 정렬되지 않은 목록에 목록 항목을 추가하는 방법 (0) | 2023.05.11 |
Xcode 디버거는 객체를 인쇄하지 않고 0으로 표시합니다. (0) | 2023.05.11 |
Eclipse JUNO가 시작되지 않습니다. (0) | 2023.05.11 |
로컬 Git 브랜치를 원격의 마스터 브랜치로 푸시하려면 어떻게 해야 합니까? (0) | 2023.05.11 |