1

我想通过安装屏蔽来获取我的设置。我使用命令参数Setup.exe /path=[SETUPEXEDIR]\log.txt 我的设置位置是Desktop\myapp\Setup.exe 当使用 [SETUPEXEDIR] 时返回我想要的临时文件夹,当使用 [SETUPEXEDIR] 时返回我的 Setup.exe 位置。

我使用 installshield 2016 版本 23 SP 2。我使用 MSI 脚本。

我想获取位置并在命令参数先决条件中使用。

4

1 回答 1

3

有点难以理解你在问什么,但据我所知,你想知道 setup.exe 的运行位置?

变量

  • 一个问题是:您使用的是哪个版本的 Installshield ?

  • 第二个问题是:您使用的是Basic MSI还是Installscript MSI

  • 第三个问题是:您使用的是什么类型的发布媒体?

  • 可能还有更多相关的问题...

给智者的一句话:如果您确实在使用 Installscript MSI,您应该知道这是一个非常错误的项目类型,您应该认真考虑切换到 Basic MSI 以免去您的痛苦。如果你愿意,我可以提供更多关于这方面的信息。我不得不完全放弃 Installscript MSI 以消除我的部署问题。

Installshield 属性

似乎不同版本的 Installshield 可能表现不同,并对这些文件夹属性/变量提供不同的支持。似乎这些属性可能不适用于所有类型的发布媒体。最后,它们可能只能分别在 Basic MSI 或 Installscript MSI 中工作。我找到的属性是:PACKAGE_LOCATIONSETUPEXEDIRSRCDIR。在最新版本的 Installshield 中似乎还有一个名为GetCurrentDir()的 Installscript 方法,但文档警告使用它(请参阅链接)。

请按顺序访问上面的链接并详细阅读每个属性(或方法)的限制。使用符合您的要求和场景的选项(如果有)非常重要。例如,PACKAGE_LOCATION 仅适用于 Installscript MSI,SETUPEXEDIR 由 Setup.exe 设置。如果最终用户直接运行 .msi 包,则不设置 SETUPEXEDIR。

MSI 内置属性

在我看来,获取内置的 MSI 属性SourceDir可能是一个尝试的选择。我的快速测试表明它适用于 InstallScript 和 Basic MSI。但是,我不知道这是否适用于所有版本的 Windows Installer。请在各种 Windows 版本上进行测试以确定。

您还应该注意使用 SourceDir 的潜在问题,该问题在SETUPEXEDIR 的文档中有所描述。这适用于编译成包含所有文件的单个压缩 setup.exe 的设置 - 此启动器会将 MSI 文件提取到临时位置并从那里运行。当我尝试使用未压缩的网络图像时,使用 SourceDir 效果很好。

最后,如果您使用 setup.exe 压缩所有文件并在系统上启用 MSI 缓存,那么您将从内部的某个地方运行:C:\WINDOWS\Downloaded Installations\{GUID}\.

在较新版本的 Installshield 上,所有这些都可能有所不同。我正在使用我可用的旧版本进行测试。请在您的版本上彻底测试。

我还应该提到OriginalDatabase内置的 MSI 属性。检查链接以获取有关如何设置的文档。

一些链接:

用于测试的安装脚本功能

仅供参考,这里有一个快速而肮脏的函数,可以从 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 等。 ..行为可能不同)。

于 2017-12-27T11:22:52.303 回答