Как я могу удалить приложение с помощью PowerShell? - PullRequest
117 голосов
/ 22 сентября 2008

Есть ли простой способ подключиться к стандартной функции Установка и удаление программ , используя PowerShell для удаления существующего приложения ? Или проверить, установлено ли приложение?

Ответы [ 12 ]

140 голосов
/ 22 сентября 2008
$app = Get-WmiObject -Class Win32_Product | Where-Object { 
    $_.Name -match "Software Name" 
}

$app.Uninstall()

Редактировать: Роб нашел другой способ сделать это с параметром Filter:

$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"
42 голосов
/ 28 августа 2014

РЕДАКТИРОВАТЬ: За эти годы этот ответ получил довольно много голосов. Я хотел бы добавить несколько комментариев. С тех пор я не использовал PowerShell, но помню, что наблюдал некоторые проблемы:

  1. Если в приведенном ниже сценарии больше совпадений, чем 1, он не работает, и необходимо добавить фильтр PowerShell, ограничивающий результаты до 1. Я считаю, что это -First 1, но я не уверен. Не стесняйтесь редактировать.
  2. Если приложение не установлено 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}
34 голосов
/ 29 января 2009

Чтобы исправить второй метод в посте Джеффа Хиллмана, вы можете сделать:

$app = Get-WmiObject 
            -Query "SELECT * FROM Win32_Product WHERE Name = 'Software Name'"

Или

$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"
7 голосов
/ 22 мая 2013

Чтобы добавить немного к этому сообщению, мне нужно было иметь возможность удалять программное обеспечение с нескольких серверов. Я использовал ответ Джеффа, чтобы привести меня к этому:

Сначала я получил список серверов, я использовал запрос AD , но вы можете предоставить массив имен компьютеров так, как вы хотите:

$computers = @("computer1", "computer2", "computer3")

Затем я просмотрел их, добавив параметр -computer в запрос gwmi:

foreach($server in $computers){
    $app = Get-WmiObject -Class Win32_Product -computer $server | Where-Object {
        $_.IdentifyingNumber -match "5A5F312145AE-0252130-432C34-9D89-1"
    }
    $app.Uninstall()
}

Я использовал свойство IdentifyingNumber для сопоставления вместо имени, просто чтобы убедиться, что удаляю правильное приложение.

6 голосов
/ 22 августа 2014

Я обнаружил, что класс Win32_Product не рекомендуется, потому что он вызывает исправления и не оптимизирован для запросов. Источник

Я нашел это сообщение от 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"}
 }
5 голосов
/ 11 октября 2018
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"
3 голосов
/ 03 декабря 2013

Я сделаю свой маленький вклад. Мне нужно было удалить список пакетов с того же компьютера. Это сценарий, который я придумал.

$packages = @("package1", "package2", "package3")
foreach($package in $packages){
  $app = Get-WmiObject -Class Win32_Product | Where-Object {
    $_.Name -match "$package"
  }
  $app.Uninstall()
}

Надеюсь, это окажется полезным.

Обратите внимание, что я обязан Дэвиду Стетлеру за этот скрипт, поскольку он основан на его.

2 голосов
/ 23 февраля 2019

Одна строка кода:

get-package *notepad* |% { & $_.Meta.Attributes["UninstallString"]}
2 голосов
/ 13 июля 2017

Вот скрипт PowerShell, использующий msiexec:

echo "Getting product code"
$ProductCode = Get-WmiObject win32_product -Filter "Name='Name of my Software in Add Remove Program Window'" | Select-Object -Expand IdentifyingNumber
echo "removing Product"
# Out-Null argument is just for keeping the power shell command window waiting for msiexec command to finish else it moves to execute the next echo command
& msiexec /x $ProductCode | Out-Null
echo "uninstallation finished"
1 голос
/ 03 ноября 2016

На основании ответа Джеффа Хиллмана:

Вот функция, которую вы можете просто добавить в profile.ps1 или определить в текущем сеансе PowerShell:

# Uninstall a Windows program
function uninstall($programName)
{
    $app = Get-WmiObject -Class Win32_Product -Filter ("Name = '" + $programName + "'")
    if($app -ne $null)
    {
        $app.Uninstall()
    }
    else {
        echo ("Could not find program '" + $programName + "'")
    }
}

Допустим, вы хотели удалить Блокнот ++ . Просто введите это в PowerShell:

> uninstall("notepad++")

Просто знайте, что Get-WmiObject может занять некоторое время, так что наберитесь терпения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...