我正在为我们的产品进行新的重大升级。 在我的安装程序中,我首先查找以前版本的配置设置,然后我想卸载以前的版本。
我找到了几个指南告诉我如何使MSI适合这种升级。
但是,之前的不是MSI 这不是根据最佳实践。
但是,它在注册表HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall {GUID}中指定了 UninstallString 。
使用RegistrySearch我可以轻松找到下面的命令,我将其存储在UNINSTALL_CMD中。
RunDll32 C:\PROGRA~1\COMMON~1\INSTAL~1\PROFES~1\RunTime\10\01\Intel32\Ctor.dll,LaunchSetup
"C:\Program Files\InstallShield Installation Information\{GUID}\setup.exe"
-l0x9 -removeonly 4:
我无法获得执行实际卸载所需的CustomAction。
<CustomAction Id="ca.UninstPrev" Property="UNINSTALL_CMD" ExeCommand="" />
MSI日志说:
信息1721.此Windows Installer程序包存在问题。无法运行此安装所需的程序。请联系您的支持人员或包装供应商。操作:ca.UninstallPrevious,位置:RunDll32 C:\ PROGRA~1 \ COMMON~1 \ INSTAL~1 \ PROFES~1 \ RunTime \ 10 \ 01 \ Intel32 \ Ctor.dll,LaunchSetup“C:\ Program Files \ InstallShield安装信息{GUID} \ setup.exe“-l0x9 -removeonly,命令:
任何人在这里看到我做错了什么?
问候
雷夫
答案 0 :(得分:5)
我在美国大陆航空公司进行了几年的应用程序重新包装,我将短信推送到18,000座森林。我经常使用未使用MSI安装的遗留应用程序,我需要使用MSI重新部署,一旦完成,我支持未来的主要升级。
这些以前部署的应用程序通常都有非常破碎和行为不端的卸载程序。我会使用SMS来查询林以获取所有已部署的版本,而不是调用这些。然后,我会将这些旧软件包部署到集成实验室,并计算每个安装程序对机器所做的操作,并编写我自己的聚合“强制清理”自定义操作,该操作能够从机器上擦除应用程序的各种版本。
我在CostInitialize之前执行了这个自定义操作,这样当新的MSI执行它的成本时,它不会受到机器上不再存在的垃圾的影响。这对我有用,因为我将软件包推送到系统,我不必担心高程问题。如果您想要完全符合UAC标准,您可能希望从prereq包中运行此自定义代码,并让您的用户手动运行它或将其连接到引导程序中以在MSI之前运行。
答案 1 :(得分:2)
我正在尝试进行50型自定义操作,启动已安装在系统上的可执行文件。
属性指定要启动的可执行文件的完整路径
ExeCommand 指定上述此可执行文件的命令行参数。
我的错是我确实在 Property 字段中放置了完整的exe +命令行。
/ L