Если программа существует, удалите - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь понять метод .uninstall().

С по этой ссылке похоже, что метод .uninstall() работает только при использовании с Get-WmiObject -Class Win32_Product.Но это означает, что он будет рассматривать только 32-разрядное программное обеспечение, а не 64-разрядное.

Поэтому я написал несколько строк, чтобы удалить Erlang, который является 64-разрядным:

# Check if a Software ins installed
function Check_Program_Installed($programName) {
    $x86_check = ((Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall") |
                 Get-ItemProperty |
                 Where-Object {$_.DisplayName -like "*$programName*" } |
                 Select-Object -Property DisplayName, UninstallString) |
                 Format-Table

    if (Test-Path 'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall') {
        $x64_check = ((Get-ChildItem "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall") | Get-ItemProperty | Where-Object {$_.DisplayName -like "*$programName*" } | Select-Object -Property DisplayName, UninstallString) | Format-Table
    }
    if ($x86_check -and $x64_check -eq $null) {
        Write-Host "$programName is not installed on this computer" -ForegroundColor Green
        #continue
    } elseif ($x86_check -or $x64_check -ne $null) {
        Write-Host "On this computer is installed " -ForegroundColor Red
        $x86_check
        $x64_check

        $x86_check.uninstall()
        $x64_check.uninstall()
    }
}

# Erlang check
Write-Host "Checking if Erlang exist    " -NoNewline
Check_Program_Installed("Erlang")
Write-Host "The End: the script ends here" -ForegroundColor Yellow

но, к сожалению, он возвращает мне ошибку:

Вы не можете вызвать метод для выражения с нулевым значением.В C: \ Users \ Admin \ Desktop \ test.ps1: 17 char: 3 + $ x86_check.uninstall () + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull

Ошибка вызова метода, поскольку [Microsoft.PowerShell.Commands.Internal.Format.FormatStartData] не содержит метод с именем «Удалить».В C: \ Users \ Admin \ Desktop \ test.ps1: 18 char: 3 + $ x64_check.uninstall () + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: MethodNotFound

Я полагаю, что основной причиной этого являются DisplayName и UninstallString в переменной, верно?

Выход, который я нашел, - это использовать:

'"C:\Program Files\erl8.3\Uninstall.exe'" | cmd

для удаления, но для этого не используется метод .uninstall(), который я хочу использовать.

Говорит ли Microsoftчто вы можете использовать .uninstall() только с 32-битной архитектурой, а для 64-битной вам нужно найти свой выход?

Если это так, то это довольно элементарно

1 Ответ

0 голосов
/ 18 февраля 2019

Ответ НЕТ.

.uninstall() может использоваться только с Get-WmiObject -Class Win32_Product и, следовательно, будет удалять только 32-разрядные программы.

Возможен альтернативный способ удаления как 32-битной, так и 64-битной программы:

Get-Package "*Erlang*"

По крайней мере находит программу, но

Get-Package "*Erlang*" | Uninstall-Package -Force

не удаляется

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