【问题标题】:If program exists uninstall如果程序存在卸载
【发布时间】:2019-07-11 05:59:36
【问题描述】:

我正在尝试理解.uninstall() 方法。

this link 看来,.uninstall() 方法仅在与Get-WmiObject -Class Win32_Product 一起使用时才有效。但这意味着它将只考虑 32 位软件而不考虑 64 位软件。

所以我写了这几行来卸载 64 位的 Erlang:

# 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

我相信根本原因是变量中有DisplayNameUninstallString,对吧?

我发现的一种方法是使用:

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

为了卸载,但这没有使用我想要使用的.uninstall() 方法。

微软是说你只能在 32 位架构上使用.uninstall(),而对于 64 位架构你需要找到自己的出路?

如果是这样,那就太简陋了

【问题讨论】:

  • 不要使用Format-* cmdlet 进行进一步的程序化 处理 - 这些cmdlet 仅用于为display 创建输出。
  • 该错误消息表示未安装x86 版本。您需要为这些 reg 键中的 每个 添加一个测试。您当前的测试仅针对“一个或另一个”。

标签: powershell methods uninstallation


【解决方案1】:

回复是否定的。

.uninstall() 只能与Get-WmiObject -Class Win32_Product 一起使用,因此只会卸载 32 位程序。

可能有另一种卸载 32 位和 64 位程序的方法:

Get-Package "*Erlang*"

至少找到程序但是

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

不会卸载

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2017-08-09
    • 2021-09-11
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多