【问题标题】:Uninstalling software (ArcFM) with powershell with no Remove option in MSI使用 powershell 卸载软件 (ArcFM),MSI 中没有删除选项
【发布时间】:2019-11-06 19:34:12
【问题描述】:

情况总结

我有一些用于 ArcGIS 的第三方扩展软件,我需要能够使用 powershell 脚本将其卸载。我已经使用 AppDeployToolkit for powershell 成功安装和卸载了一套软件,但我一直在尝试卸载这个程序。我可以通过使用“卸载参数”运行 MSI 来卸载所有内容。不幸的是,这个第三方扩展在 msi 中没有卸载/删除选项(当我手动运行它时没有修复、删除或卸载选项)。它只是尝试再次安装。但是,我能够从 Windows 中的“应用程序和功能”程序 GUI 工具中成功卸载。

这是我尝试过的事情:

尝试A:使用 AppDeployToolkit

Execute-MSI -Action "Uninstall" -Path "Path\To\ArcFM.msi"

输出:错误:应用程序已安装

尝试B:使用 WMI 对象

$app = get-wmiobject -class win32_product |where-object {$_.Name -Match "ArcFM Solution Desktop*"}
$app.Uninstall()

输出1603 错误(这是安装错误的错误代码)

尝试C:使用卸载包

$app = get-package -provider programs -includewindowsinstaller -name "ArcFM*
Uninstall-Package -Name $app

输出:要求我自动安装Microsoft.PackageManagement.NuGetProvider-2.8.5.208.dll。当我输入Y 自动安装时,我得到这个错误......

Uninstall-Package : No package found for 'Microsoft.PackageManagement.Packaging.SoftwareIdentity'.
At line:1 char:1
+ Uninstall-Package -Name $arcfm2
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Microsoft.Power...ninstallPackage:UninstallPackage) [Uninstall-Package], Exception
    + FullyQualifiedErrorId : NoMatchFound,Microsoft.PowerShell.PackageManagement.Cmdlets.UninstallPackage

我的问题

我的总体问题是“如何从 powershell 卸载此软件?”

但更具体地说....

可以从“应用程序和功能”中卸载它。因此,当我使用 GUI 执行此操作时,Windows 究竟是如何执行卸载的?它没有使用 MSI,显然也没有使用 wmi-objects。它不能使用 Uninstall-Package,因为它甚至没有安装在机器上。有没有办法让我执行添加/删除程序执行从 powershell 卸载的相同过程?有没有其他方法可以卸载我错过的软件?

【问题讨论】:

  • 可能没有静默卸载程序。这说明了什么? get-package arcfm | % { $_.metadata['uninstallstring'] }
  • 如果它不是 MSI 包,那么您需要从注册表中获取卸载命令行(即,与 Apps and Features 小程序使用的相同)并运行它。
  • 我给了我一个索引错误,因为一个空数组......但是如果你想看看我在注册表中是否有一个卸载字符串,我实际上只是在 regedit 中找到的。它是一个以 msiexec.exe 和 /i 参数为前缀的长代码字符串。当我将它粘贴到 powershell 时,虽然它给了我 Windows 安装程序帮助窗口,但没有执行任何操作
  • MsiExec.exe /I{7642F00E-69A2-4687-ADBD-4567A05FAF85}
  • 那么它确实是一个 Windows 安装程序包。运行msiexec /x "{guid}" /qb

标签: windows powershell wmi uninstallation get-wmiobject


【解决方案1】:

在以前的生活中,我使用了一个名为 PDQ 的有趣产品来管理应用程序部署。该产品的一个很酷的功能是它为已安装的应用程序提取产品 GUID 并为它们构建卸载程序。它是这样做的:

# GUID is not unique across multiple computers, so pull it from the machine
$gui = Get-WMIObject Win32_Product | Where-Object -Property name -like "ArcFM*" | Select-Object -ExpandProperty IdentifyingNumber
# Use MSIexec.exe /x = uninstall /QN = silent
msiexec /x $guid

希望对您有所帮助!

更新 我正在编辑答案,以便我可以接受它。从最终命令中删除 /QN 参数。将它放在 $guid 变量之后也可以。

【讨论】:

  • 我真的很欣赏这种检索 GUID 而不是导航 regedit 的方式。我的问题与我将它留在上面的 OP 的 cmets 中的问题相同。当我运行您刚刚给我的命令时,msiexec.msi 会打开 Windows 安装程序帮助窗口。通常当我缺少参数时会发生这种情况?
  • 嘿!这行得通,但是它不适用于 /QN 参数。我不得不删除它。也许它需要追求$ guid?过去我将静音参数放在执行字符串之后而不是之前。
  • 另外,如果您碰巧正在使用 Core,或者保留它以供以后使用,“Get-CimInstance CIM_Product”将替换 PowerShell Core 中的此功能。核心不包含 WMIObject cmdlet。
  • 这是很好的信息。当我在我的个人机器上使用 Linux 工作时,我一直在探索核心部分。
  • 是的,有时候安静是很困难的。但是,唯一让我遇到 msiexec 问题的程序是防病毒程序。我不完全确定它是如何工作的,但我不相信它使用程序打包的 msi 进行卸载。或者至少行为通常与打包的 msi 非常不同。
猜你喜欢
  • 2010-11-19
  • 2019-01-19
  • 1970-01-01
  • 2011-06-18
  • 2022-07-03
  • 2014-12-01
  • 2015-03-25
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多