有点难以理解你到底在问什么,但是据我了解,您想知道 setup.exe 运行的位置?
变量
给智者的一句话:如果您确实在使用 Installscript MSI,您应该知道这是一个非常有缺陷的项目类型,您应该认真考虑切换到 Basic MSI,以免自己陷入困境。如果您愿意,我可以提供更多相关信息。我不得不完全放弃 Installscript MSI 才能解决我的部署问题。
安装屏蔽属性
不同版本的 Installshield 似乎可能表现不同,并且对这些文件夹属性/变量的支持也不同。这些属性似乎也不适用于所有类型的发布介质。最后,它们可能只能分别在 Basic MSI 或 Installscript MSI 中工作。我发现的属性是:包裹_位置 http://helpnet.installshield.com/installshield21helplib/Subsystems/installshield21langref/helplibrary/PACKAGE_LOCATION.htm#langref_variabledata_2139200659_1022943, 设置执行目录 http://helpnet.installshield.com/installshield21helplib/helplibrary/SETUPEXEDIR.htm and SRCDIR http://helpnet.installshield.com/installshield21helplib/Subsystems/installshield21langref/helplibrary/LangrefSRCDIR.htm#langref_variabledata_2139200659_1023134。似乎还有一个名为的 Installscript 方法获取当前目录() http://helpnet.installshield.com/installshield22helplib/Subsystems/installshield22langref/helplibrary/LangrefGetCurrentDir.htm在最新版本的 Installshield 中可用,但文档警告有关使用它的信息(请参阅链接)。
请按顺序访问上面的链接并详细阅读每个属性(或方法)的限制。使用符合您的要求和场景的选项(如果有)非常重要。例如,PACKAGE_LOCATION 仅适用于Installscript MSI,SETUPEXEDIR 由Setup.exe 设置。如果最终用户直接运行 .msi 包,则不会设置 SETUPEXEDIR。
MSI 内置属性
在我看来,获取内置 MSI 属性源目录 https://msdn.microsoft.com/en-us/library/windows/desktop/aa371857%28v=vs.85%29.aspx可能是一个可以尝试的选择。我的快速测试表明它适用于 InstallScript 和 Basic MSI。但是,我不知道这是否适用于所有版本的 Windows Installer。请在各种 Windows 版本上进行测试以确定。
您还应该意识到使用 SourceDir 的潜在问题,该问题在SETUPEXEDIR 的文档 http://helpnet.installshield.com/installshield21helplib/helplibrary/SETUPEXEDIR.htm。这适用于编译为包含所有文件的单个压缩 setup.exe 的安装程序 - 此启动器会将 MSI 文件提取到临时位置并从那里运行。当我尝试使用未压缩的网络图像时,使用 SourceDir 效果很好。
最后,如果您使用 setup.exe 压缩所有文件并启用系统上 MSI 的缓存,那么您将从内部某处运行:C:\WINDOWS\Downloaded Installations\{GUID}\
.
所有这些在较新版本的 Installshield 上都可能有所不同。我正在使用现有的旧版本进行测试。请对您的版本进行彻底测试。
我还应该提到原始数据库 https://msdn.microsoft.com/en-us/library/aa370562%28VS.85%29.aspx内置 MSI 属性。检查链接以获取有关如何设置的文档。
一些链接:
-
Installscript 项目 - 获取 Setup.exe 位置 https://community.flexerasoftware.com/archive/index.php?t-149584.html.
- 如何找到setup.exe目录? http://forum.installsite.net/index.php?showtopic=14025
用于测试的 Installscript 函数
仅供参考,这里有一个快速但肮脏的函数,用于通过 Installshield 自定义操作测试这些属性(这适用于其他可能在没有像您一样进行测试的情况下发现此问题的人):
function TestFolderProperties(hMSI)
STRING svName;
NUMBER nvSize;
begin
// MSI properties
nvSize = 256;
MsiGetProperty (hMSI, "SETUPEXEDIR", svName, nvSize);
MessageBox ("SETUPEXEDIR: " + svName, INFORMATION);
MsiGetProperty (hMSI, "SourceDir", svName, nvSize);
MessageBox ("SourceDir: " + svName, INFORMATION);
MsiGetProperty (hMSI, "OriginalDatabase", svName, nvSize);
MessageBox ("OriginalDatabase: " + svName, INFORMATION);
// System Variables
MessageBox ("SRCDIR: " + SRCDIR, INFORMATION);
// PACKAGE_LOCATION is not available in my version of Installshield, enable and test
//MessageBox ("PACKAGE_LOCATION: " + PACKAGE_LOCATION, INFORMATION);
end;
请记住将导出添加到 setup.rul 文件的顶部:
export prototype TestFolderProperties(HWND);
测试编译以验证,然后创建 Installscript 自定义操作并将其放入序列中。使自定义操作的“返回处理”同步(忽略退出代码)。我将其放在序列中的 InstallFinalize 之前,使用立即模式执行。重建您的版本并运行它。尝试不同的版本构建配置(带有外部源文件的 MSI、仅带有内部压缩文件的 MSI、带有外部文件的 setup.exe 启动器、带有压缩内部所有文件的 setup.exe、带有缓存的 setup.exe、不带缓存的 setup.exe 等。 ..行为可能会有所不同)。