我目前有一个应用程序是作为.msi安装程序(用Wix构建的)分发的。我刚刚完成了将此应用程序移植到Electron,以利用所有最新和最伟大的功能,包括使用Electron Builder和自动更新。
任何wix/msi专家都知道卸载旧的msi并运行新的安装程序的最佳方法?我找到的解决方案包括搜索Windows注册表以查找msi UUID,然后使用msiexec。
有没有可能只创建一个新版本的.msi来清理所有的东西?
发布于 2019-03-05 08:30:55
如果我没理解错的话,你想从微星格式迁移到NSIS格式吗?这里有一篇关于这方面的文章:https://nsis.sourceforge.io/Uninstalling_a_previous_MSI。
但是,我建议您找到微系统接口的产品代码,并使用产品代码和您自己的卸载字符串(而不是上面文档中显示的从注册表获得的字符串)调用msiexec.exe
。通过这种方式,您可以添加一些构造来防止自发地重新启动,并强制执行适当的静默运行的。下面将介绍这种方法。
卸载MSI:您可以通过以下方式运行卸载命令来卸载以前的MSI版本:Uninstalling an MSI file from the command line without using msiexec。
查找产品代码:可以通过如下方式查找微星的产品GUID:How can I find the product GUID of an installed MSI setup?
命令行:结合上面第一个链接中的方法3.5和使用第二个链接中的信息找到的产品代码,您可以使用如下命令行从您的NSIS调用:
msiexec.exe /x {11111111-1111-1111-1111-11111111111X} /QN /L*V "C:\msilog.log" REBOOT=ReallySuppress
快速参数说明
/X = run uninstall sequence
{11111111-1111-1111-1111-11111111111X} = product guid of app to uninstall
/QN = run completely silently
/L*V "C:\msilog.log"= verbose logging at path specified
REBOOT=ReallySuppress = prevent unexpected reboot of computer
ExecWait:NSIS需要自己特有的命令格式:Running MSIEXEC in a NSIS script with installer switches。我还没有测试过这一点,但我有一个建议:
StrCpy $R0 "{11111111-1111-1111-1111-11111111111X}"; the MSI's ProductID of my package
ExecWait '"msiexec.exe" /x $R0 /QN REBOOT=ReallySuppress'
查看此处对命令行进行微调:https://nsis.sourceforge.io/Uninstalling_a_previous_MSI。
链接
https://stackoverflow.com/questions/54993235
复制相似问题