Windows installer 在主要升级过程中,如何在InstallScript中找到应用程序以前的安装位置?

Windows installer 在主要升级过程中,如何在InstallScript中找到应用程序以前的安装位置?,windows-installer,installshield,installscript,Windows Installer,Installshield,Installscript,我正在更新一个使用InstallShield编写的安装程序,以执行应用程序的主要升级,并通过自定义操作调用InstallScript函数来备份和恢复应用程序目录中的一些文件。我的脚本与以前的安装目录硬编码,但需要找到应用程序的实际安装位置 我可以使用以下方法获取当前安装的位置: MsiGetProductInfo(PRODUCT_GUID, INSTALLPROPERTY_INSTALLLOCATION, savedInstallDir, bufferSize); 但如果我将PRODUCT_G

我正在更新一个使用InstallShield编写的安装程序,以执行应用程序的主要升级,并通过自定义操作调用InstallScript函数来备份和恢复应用程序目录中的一些文件。我的脚本与以前的安装目录硬编码,但需要找到应用程序的实际安装位置

我可以使用以下方法获取当前安装的位置:

MsiGetProductInfo(PRODUCT_GUID, INSTALLPROPERTY_INSTALLLOCATION, savedInstallDir, bufferSize);
但如果我将PRODUCT_GUID更改为上一次安装的产品代码的硬编码值,则在savedInstallDir中会得到一个空字符串:

MsiGetProductInfo("{my-previous-product-code}", INSTALLPROPERTY_INSTALLLOCATION, savedInstallDir, bufferSize);

是否确实已为已安装的旧版本保留安装位置?当您尝试从VBScript(当然,使用您自己的产品GUID进行更新)时,您是否得到了任何信息:

我检查了所有安装的软件包,只有大约十几个(几百个软件包中的一个)保持了这个路径


在注册表中:查找位置下的值“InstallLocation”:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\PACKEDGUIDHERE\InstallProperties

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{REGULARGUIDHERE}

指南:


成功了-谢谢!我在InstallScript中做的如下:
set installer=CreateObject(“WindowsInstaller.installer”);SprintfMsiLog(“BackupUserData:previousinstall dir%s”,installer.ProductInfo(“{my previous product code}”,“InstallLocation”)如果产品未安装,则会引发异常,但这应该很容易解决。谢谢你的帮助!通过C++自定义操作,您尝试过MSI API函数吗?这可能是更好的选择。当心每个用户安装和这些东西-这可能是一个问题(没有安装每台机器)。我使用安装脚本的自定义动作-我不想参与到介绍C++在这一点。我前面评论中的方法使用try/catch来处理异常,所以我对此很满意。它有到相关主题的进一步链接。当你从C++调用MsiGetProductInfo时,会有一点复杂。
Dim installer : Set installer = CreateObject("WindowsInstaller.Installer")
MsgBox installer.ProductInfo("{9B061D60-4E2C-4987-BFFD-423E3D477660}","InstallLocation")