Как я могу удалить приложение с помощью PowerShell?

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

112 голосов | спросил Rob Paterson 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 22 Sep 2008 11:04:06 +0400 2008, 11:04:06

11 ответов


0
 $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'"
ответил Jeff Hillman 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 22 Sep 2008 11:17:01 +0400 2008, 11:17:01
0

РЕДАКТИРОВАТЬ: За эти годы этот ответ получил довольно много голосов. Я хотел бы добавить несколько комментариев. С тех пор я не использовал 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}
ответил nickdnk 28 PM00000020000003731 2014, 14:26:37
0

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

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

или

 $app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"
ответил Robert Wagner 29 Jam1000000amThu, 29 Jan 2009 10:02:12 +030009 2009, 10:02:12
0

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

Сначала я получил список серверов и использовал 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 для сопоставления вместо имени, просто чтобы убедиться, что удаляю правильное приложение.

ответил David Stetler 22 Mayam13 2013, 00:37:11
0

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

Я нашел этот пост из Ситарам Парарти с скрипт для удаления, если вы знаете руководство приложения. Он также предоставляет другой скрипт для действительно быстрого поиска приложений

ответил Ricardo 22 PM00000060000000431 2014, 18:22:04
0

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

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

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

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

ответил Ben Key 3 TueEurope/Moscow2013-12-03T08:09:11+04:00Europe/Moscow12bEurope/MoscowTue, 03 Dec 2013 08:09:11 +0400 2013, 08:09:11
0

Вот сценарий 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"
ответил RBT 13 J000000Thursday17 2017, 15:32:29
0

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

Вот функция, которую вы можете просто добавить в свой 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 может занять некоторое время, так что наберитесь терпения!

ответил Kolob Canyon 3 42016vEurope/Moscow11bEurope/MoscowThu, 03 Nov 2016 02:08:52 +0300 2016, 02:08:52
0
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"
ответил Ehsan Irannejad 11 +03002018-10-11T02:13:35+03:00312018bEurope/MoscowThu, 11 Oct 2018 02:13:35 +0300 2018, 02:13:35
0

Использование:

 function remove-HSsoftware{
[cmdletbinding()]
param(
[parameter(Mandatory=$true,
ValuefromPipeline = $true,
HelpMessage="IdentifyingNumber can be retrieved with `"get-wmiobject -class win32_product`"")]
[ValidatePattern('{[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}}')]
[string[]]$ids,
[parameter(Mandatory=$false,
            ValuefromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Computer name or IP adress to query via WMI")]
[Alias('hostname,CN,computername')]
[string[]]$computers
)
begin {}
process{
    if($computers -eq $null){
    $computers = Get-ADComputer -Filter * | Select dnshostname |%{$_.dnshostname}
    }
    foreach($computer in $computers){
        foreach($id in $ids){
            write-host "Trying to uninstall sofware with ID ", "$id", "from computer ", "$computer"
            $app = Get-WmiObject -class Win32_Product -Computername "$computer" -Filter "IdentifyingNumber = '$id'"
            $app | Remove-WmiObject

        }
    }
}
end{}}
 remove-hssoftware -ids "{8C299CF3-E529-414E-AKD8-68C23BA4CBE8}","{5A9C53A5-FF48-497D-AB86-1F6418B569B9}","{62092246-CFA2-4452-BEDB-62AC4BCE6C26}"

Он не полностью протестирован, но работает под PowerShell 4.

Я запустил файл PS1, как показано здесь. Позволяет ему получать все системы из AD и пытается удалить несколько приложений во всех системах. /р>

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

Не проверено:

  1. Не добавляйте идентификаторы к вызову функции в сценарии, вместо этого запускайте сценарий с идентификаторами параметров
  2. Вызов сценария с более чем одним именем компьютера не , автоматически извлекаемый из функции
  3. Получение данных из канала
  4. Использование IP-адресов для подключения к системе

Что это не так:

  1. Он не предоставляет никакой информации, если программное обеспечение действительно было найдено в какой-либо конкретной системе.
  2. Он не предоставляет никакой информации о неудаче или успехе деинсталляции.

Я не смог использовать uninstall (). При попытке получить ошибку, сообщающую, что вызов метода для выражения со значением NULL невозможен. Вместо этого я использовал Remove-WmiObject, который, кажется, выполняет то же самое.

ВНИМАНИЕ : без указания имени компьютера оно удаляет программное обеспечение из ВСЕХ систем в Active Directory.

ответил user3410872 12 MarpmWed, 12 Mar 2014 17:45:10 +04002014-03-12T17:45:10+04:0005 2014, 17:45:10
0

Для большинства моих программ скрипты в этом посте сделали свое дело. Но мне пришлось столкнуться с устаревшей программой, которую я не мог удалить, используя msiexec.exe или класс Win32_Product. (по какой-то причине я получил выход 0, но программа все еще была там)

Моим решением было использовать класс Win32_Process:

с помощью nickdnk этой команды нужно получить путь к файлу деинсталляции exe:

64bit:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString

32bit:

 [array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString

вам придется очистить строку результата:

$uninstallPath = $unInstallPathReg[0].UninstallString
$uninstallPath = $uninstallPath -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstallPath = $uninstallPath .Trim()

теперь, когда у вас есть соответствующий путь удаления исполняемого файла программы , вы можете использовать эту команду:

$uninstallResult = (Get-WMIObject -List -Verbose | Where-Object {$_.Name -eq "Win32_Process"}).InvokeMethod("Create","$unInstallPath")
  

$ uninstallResult - будет иметь код выхода. 0 - это успех

вышеприведенные команды также могут выполняться удаленно - я сделал это с помощью команды invoke, но я считаю, что добавление аргумента -computername может работать

ответил dsaydon 26 J0000006Europe/Moscow 2017, 10:48:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132