[windows] PowerShell을 사용하여 응용 프로그램을 제거하려면 어떻게해야합니까?

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보다 많은 일치 항목이있는 경우 작동하지 않으며 결과를 1로 제한하는 PowerShell 필터를 추가해야합니다. 믿지만 -First 1확실하지 않습니다. 자유롭게 편집하십시오.
  2. 응용 프로그램이 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"]}