我自己对这个主题所做的所有研究似乎都声称每个已安装的程序都被分配了一个唯一的GUID。考虑到这一点,我开始设计一个非常简单的.bat文件,该文件将使用msiexec静默卸载一组程序列表
。使用 MSI 库存(类似于从 HKLM 下的注册表获取 GUID),我收集了要卸载的每个程序的所有产品代码。
例:
Product code: {89C254A9-2FB5-4FC9-B34F-BDEB2713C5FA}
Product state: (5) Installed.
Package code: {BD709EB5-2B9C-4664-A654-C9AB18B25DBE}
Version: 2.10.28
我从上面的例子中获取了产品代码,并非常简单地编写了我的批处理:
msiexec /x {89C254A9-2FB5-4FC9-B34F-BDEB2713C5FA} /passive
据我了解,此ID:{89C254A9-2FB5-4FC9-B34F-BDEB2713C5FA}对于我正在卸载的该程序应该是唯一的。因此,如果我从另一台安装了相同程序的计算机运行此批处理,它将找到它并被动卸载它,而无需用户所需的输入。
但是,我的结果好坏参半。它从某些计算机中卸载,有些计算机似乎找不到该程序。无法卸载该程序的计算机上的 MSI 清单显示不同的产品代码。
我想知道,这些产品代码是否真正是唯一的GUID,这些GUID是在程序创建时创建并嵌入到安装程序中的?它们在安装程序的每台计算机上是否应该相同?
如果答案是肯定的,我必须处理一个"不同版本"的问题,其中程序代码随着时间的推移而变化......但是在我将太多工作放入可能只起作用的.bat文件中之前,我需要确定 - 有时 - 时间。
谢谢!
GUID 因已安装应用程序的不同版本和语言而异。在尝试使用此批处理文件取消它们之前,应首先确保它们相同。不过,有比使用批处理文件更好的方法。
如果您了解 C/C++请考虑有关使用 Windows 安装程序 (http://msdn.microsoft.com/en-us/library/aa372463%28v=vs.85%29.aspx) 的 MSDN 文档,尤其是确定安装上下文部分。
产品代码是一个 GUID,被视为应用程序或产品的主要标识。 保持包名称和包代码一致是"Windows 安装程序最佳做法"。某些类型的更新需要更改产品代码。MSDN 文档:更改产品代码中介绍了这些内容。
因此,一个产品可以有多个产品代码。
产品代码是产品代码属性的值。 切勿为不同的产品分配任何其他产品使用的相同产品代码 guid。 这将是一件非常糟糕的事情,但是没有机制可以防止它。包作者负责使用 GUIDGEN 等实用工具获取唯一的 GUID。(请注意:GUIDGEN 等实用工具可以生成包含小写字母的 GUID。这些必须全部更改为大写字母,安装程序才能将 GUID 用作有效的产品代码。