You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Ansible win_package模块所需的Beyond Compare的product_id?

如何为Beyond Compare获取ansible.windows.win_package所需的product_id实现幂等安装?

我正在自动化安装30多款软件,包括7-zip、Adobe Reader、Beyond Compare等。前两款已经找到可用的product_id,其中Adobe Reader是反复查找注册表后成功获取的。但处理Beyond Compare时遇到了瓶颈:

  • 花了数小时查找注册表、尝试各种值,win_package模块仍因无法识别product_id而重复安装
  • 尝试过寻找MSI文件,但Beyond Compare似乎没有对应的MSI安装包
  • 试过winget、Get-WmiObject等PowerShell命令收集安装信息,依然没有结果

我的疑问:

  • 我遗漏了什么?
  • 是否有其他方法获取无MSI安装程序的product_id,或在安装后获取该值?
  • 让这个模块实现幂等性是否毫无可能?

我的Ansible任务代码:

- name: Install Beyond Compare
  ansible.windows.win_package:
    path: C:\temp\BCompare-4.4.3.26655.exe
    product_id: ?
    arguments: /VERYSILENT /NORESTAR

我尝试过的product_id值:

  • BCompare
  • BeyondCompare
  • Scooter Software
  • Beyond Compare 4
  • Beyond Compare 4.4.3

解决思路

1. 查找Beyond Compare的卸载注册表项

很多非MSI格式的exe安装程序会在系统注册表的特定路径创建卸载条目。安装Beyond Compare后,打开PowerShell执行以下命令:

Get-ChildItem -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | 
    Get-ItemProperty | 
    Where-Object {$_.DisplayName -like "*Beyond Compare*"} | 
    Select-Object DisplayName, UninstallString, PSChildName

命令输出中的PSChildName字段,通常就是可以用作product_id的标识——不少非MSI程序会用这个注册表键名作为产品识别ID,而非传统MSI的GUID格式。

2. 用自定义检测逻辑绕过product_id限制

如果确实找不到可用的product_id,可以通过检测主程序文件是否存在来实现幂等性,结合win_stat和win_package模块使用:

- name: Check if Beyond Compare is installed
  ansible.windows.win_stat:
    path: C:\Program Files\Beyond Compare 4\BCompare.exe
  register: bcompare_installed

- name: Install Beyond Compare
  ansible.windows.win_package:
    path: C:\temp\BCompare-4.4.3.26655.exe
    arguments: /VERYSILENT /NORESTAR
  when: not bcompare_installed.stat.exists

这种方式直接通过目标文件的存在状态判断是否需要执行安装,完全绕过product_id的限制,实现可靠的幂等。

3. 尝试提取安装包内部文件

部分exe安装包支持静默提取内部文件,执行以下命令尝试提取Beyond Compare安装包的内容:

.\BCompare-4.4.3.26655.exe /extract:"C:\temp\bcompare_extract" /silent

提取后查看是否有隐藏的MSI文件或配置文件,这类文件中可能包含产品标识信息。

4. 了解win_package的非MSI支持逻辑

win_package模块对非MSI程序的幂等性判断,依赖于程序在注册表中创建的标准卸载条目。如果Beyond Compare没有生成符合模块预期的卸载条目,那么通过product_id实现自动幂等确实不可行,此时自定义检测逻辑是最稳妥的方案。


内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:53:07