获取目录设置安装屏蔽

Get dir setup install shield

我想获取安装盾创建的安装目录。 我使用命令参数 Setup.exe /path=[SETUPEXEDIR]\log.txt 我的设置位置是 Desktop\myapp\Setup.exe 使用 [SETUPEXEDIR] return 临时文件夹时 我想在使用 [SETUPEXEDIR] return 时使用我的 Setup.exe 位置。

我使用的是installshield 2016 version 23 SP 2。 我使用 MSI 脚本。

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

有点难以准确理解您的问题,但据我了解,您想知道 setup.exe 运行 的位置?

变量

  • 第一个问题是:您使用的 Installshield 版本是什么?

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

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

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

明智的一句话:如果你确实在使用 Installscript MSI,你应该知道这是一个非常有问题的项目,你应该认真考虑切换到 Basic MSI以挽救自己的悲伤。如果您愿意,我可以提供更多相关信息。我不得不完全放弃 Installscript MSI 以解决我的部署问题。

安装屏蔽属性

似乎不​​同版本的 Installshield 的行为可能不同,并且对这些文件夹属性/变量的支持也不同。似乎这些属性可能不适用于所有类型的发行媒体。最后,它们可能只能分别在 Basic MSI 或 Installscript MSI 中工作。我发现的属性是:PACKAGE_LOCATION, SETUPEXEDIR and SRCDIR. There also appears to be an Installscript method called GetCurrentDir() 在最新版本的 Installshield 中可用,但文档警告使用它(请参阅 link)。

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

微星内置属性

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

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

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

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

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

一些links:

用于测试的安装脚本函数

仅供参考,这里有一个快速而肮脏的函数,用于从 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自定义动作,并把它放在一个序列中。为自定义操作设置 "Return Processing" 同步(忽略退出代码)。我将它放在序列中的 InstallFinalize 之前,使用立即模式执行。重建您的版本并 运行 它。尝试不同的发布构建配置(带有外部源文件的 msi,仅带有内部压缩文件的 MSI,带有外部文件的 setup.exe 启动器,setup.exe 带有内部压缩的所有文件,setup.exe 带有缓存,setup.exe 没有缓存等...行为可能不同)。