PowerShell을 사용하여 표준 ‘ 프로그램 추가 / 제거 ‘기능에 연결하여 기존 응용 프로그램 을 제거하는 간단한 방법이 있습니까? 아니면 응용 프로그램이 설치되어 있는지 확인 하시겠습니까?
답변
$app = Get-WmiObject -Class Win32_Product | Where-Object {
$_.Name -match "Software Name"
}
$app.Uninstall()
편집 : Rob은 Filter 매개 변수를 사용하여 다른 방법을 찾았습니다.
$app = Get-WmiObject -Class Win32_Product `
-Filter "Name = 'Software Name'"
답변
편집 : 몇 년 동안이 대답은 꽤 많은 공감을 얻었습니다. 의견을 추가하고 싶습니다. 이후 PowerShell을 사용하지 않았지만 몇 가지 문제를 관찰 한 것을 기억합니다.
- 아래 스크립트에 대해 1보다 많은 일치 항목이있는 경우 작동하지 않으며 결과를 1로 제한하는 PowerShell 필터를 추가해야합니다. 믿지만
-First 1
확실하지 않습니다. 자유롭게 편집하십시오. - 응용 프로그램이 MSI에 의해 설치되어 있지 않으면 작동하지 않습니다. 다음과 같이 작성된 이유는 개입없이 MSI를 제거하기 위해 MSI를 수정하기 때문입니다. 이는 기본 제거 문자열을 사용할 때 항상 기본이되는 것은 아닙니다.
WMI 개체를 사용하는 데는 시간이 오래 걸립니다. 제거하려는 프로그램의 이름 만 알고 있으면 매우 빠릅니다.
$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "SOFTWARE NAME" } | select UninstallString
$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "SOFTWARE NAME" } | select UninstallString
if ($uninstall64) {
$uninstall64 = $uninstall64.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall64 = $uninstall64.Trim()
Write "Uninstalling..."
start-process "msiexec.exe" -arg "/X $uninstall64 /qb" -Wait}
if ($uninstall32) {
$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall32 = $uninstall32.Trim()
Write "Uninstalling..."
start-process "msiexec.exe" -arg "/X $uninstall32 /qb" -Wait}
답변
Jeff Hillman의 게시물에서 두 번째 방법을 수정하려면 다음 중 하나를 수행하십시오.
$app = Get-WmiObject
-Query "SELECT * FROM Win32_Product WHERE Name = 'Software Name'"
또는
$app = Get-WmiObject -Class Win32_Product `
-Filter "Name = 'Software Name'"
답변
Win32_Product 클래스는 복구를 트리거하고 쿼리 최적화되지 않았으므로 권장하지 않는다는 것을 알았습니다. 출처
앱 guid를 알고 있다면 제거 할 스크립트가있는 Sitaram Pamarthi 에서이 게시물 을 찾았 습니다 . 또한 여기에서 정말 빠르게 앱을 검색 할 수있는 또 다른 스크립트를 제공 합니다 .
다음과 같이 사용하십시오.. \ uninstall.ps1 -GUID {C9E7751E-88ED-36CF-B610-71A1D262E906}
[cmdletbinding()]
param (
[parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string]$ComputerName = $env:computername,
[parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,Mandatory=$true)]
[string]$AppGUID
)
try {
$returnval = ([WMICLASS]"\\$computerName\ROOT\CIMV2:win32_process").Create("msiexec `/x$AppGUID `/norestart `/qn")
} catch {
write-error "Failed to trigger the uninstallation. Review the error message"
$_
exit
}
switch ($($returnval.returnvalue)){
0 { "Uninstallation command triggered successfully" }
2 { "You don't have sufficient permissions to trigger the command on $Computer" }
3 { "You don't have sufficient permissions to trigger the command on $Computer" }
8 { "An unknown error has occurred" }
9 { "Path Not Found" }
9 { "Invalid Parameter"}
}
답변
이 게시물에 약간을 추가하려면 여러 서버에서 소프트웨어를 제거 할 수 있어야했습니다. 나는 Jeff의 대답을 사용하여 나를 이끌어 냈습니다.
먼저 서버 목록을 얻었고 AD 쿼리를 사용했지만 원하는 컴퓨터 이름 배열을 제공 할 수 있습니다.
$computers = @("computer1", "computer2", "computer3")
그런 다음 gwmi 쿼리에 -computer 매개 변수를 추가하여 반복했습니다.
foreach($server in $computers){
$app = Get-WmiObject -Class Win32_Product -computer $server | Where-Object {
$_.IdentifyingNumber -match "5A5F312145AE-0252130-432C34-9D89-1"
}
$app.Uninstall()
}
올바른 응용 프로그램을 제거했는지 확인하기 위해 IdentificationingNumber 속성을 이름 대신 일치시키는 데 사용했습니다.
답변
function Uninstall-App {
Write-Output "Uninstalling $($args[0])"
foreach($obj in Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") {
$dname = $obj.GetValue("DisplayName")
if ($dname -contains $args[0]) {
$uninstString = $obj.GetValue("UninstallString")
foreach ($line in $uninstString) {
$found = $line -match '(\{.+\}).*'
If ($found) {
$appid = $matches[1]
Write-Output $appid
start-process "msiexec.exe" -arg "/X $appid /qb" -Wait
}
}
}
}
}
이런 식으로 부르십시오 :
Uninstall-App "Autodesk Revit DB Link 2019"
답변
한 줄의 코드 :
get-package *notepad* |% { & $_.Meta.Attributes["UninstallString"]}