Installation 获取目录安装程序安装屏蔽

Installation 获取目录安装程序安装屏蔽,installation,windows-installer,installshield,installscript,installscript-msi,Installation,Windows Installer,Installshield,Installscript,Installscript Msi,我想通过install shield获取我的安装程序创建的目录。 我使用命令parameterSetup.exe/path=[SETUPEXEDIR]\log.txt 我的安装位置是Desktop\myapp\setup.exe 使用[SETUPEXEDIR]返回临时文件夹时 我想在使用[SETUPEXEDIR]时返回我的Setup.exe位置 我使用installshield 2016版本23 SP 2。 我使用MSI脚本 我想在命令参数先决条件中获取位置和用法。要准确理解您的要求有点困难,但

我想通过install shield获取我的安装程序创建的目录。 我使用命令parameter
Setup.exe/path=[SETUPEXEDIR]\log.txt
我的安装位置是
Desktop\myapp\setup.exe
使用[SETUPEXEDIR]返回临时文件夹时 我想在使用[SETUPEXEDIR]时返回我的Setup.exe位置

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


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

要准确理解您的要求有点困难,但据我所知,您想知道setup.exe运行的位置吗

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

  • 第二个问题是:您使用的是基本MSI还是安装脚本MSI

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

  • 可能还有更相关的问题

<强>一个单词“明智”/强>:如果你真的使用了安装脚本MSI,你应该知道它是一个非常笨拙的项目类型,并且你应该认真考虑切换到基本MSI来保存你自己的悲伤。如果你愿意,我可以提供更多的信息。为了解决部署问题,我不得不完全放弃Installscript MSI

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

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

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

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

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

所有这些在更新版本的Installshield上都可能有所不同。我正在用我现有的一个古老版本进行测试。请对您的版本进行彻底测试

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

一些链接:

用于测试的Installscript函数 仅供参考,这里有一个快速而肮脏的函数,可以从Installshield自定义操作中测试这些属性(这是为其他人提供的,他们可能没有像您一样进行过测试):

函数TestFolderProperties(hMSI)
字符串svName;
数量和大小;
开始
//MSI属性
nvSize=256;
MsiGetProperty(hMSI,“SETUPEXEDIR”、svName、nvSize);
MessageBox(“SETUPEXEDIR:+svName,信息);
MsiGetProperty(hMSI,“SourceDir”、svName、nvSize);
MessageBox(“SourceDir:+svName,信息);
MsiGetProperty(hMSI,“原始数据库”、svName、nvSize);
MessageBox(“原始数据库:+svName,信息”);
//系统变量
MessageBox(“SRCDIR:+SRCDIR,信息);
//在我的Installshield、enable和test版本中,包_位置不可用
//MessageBox(“包位置:+包位置,信息);
结束;
请记住将导出添加到setup.rul文件的顶部:

导出原型TestFolderProperties(HWND);

测试编译以验证,然后创建Installscript自定义操作并将其放入序列中。使自定义操作的“返回处理”同步(忽略退出代码)。我将它放在序列中InstallFinalize之前,使用即时模式执行。重建您的发行版并运行它。尝试不同的版本生成配置(包含外部源文件的msi、仅包含内部压缩文件的msi、包含外部文件的setup.exe启动器、包含内部压缩的所有文件的setup.exe、包含缓存的setup.exe、不包含缓存的setup.exe等。行为可能不同).

根据你想做的事情,斯坦的回答应该对你有所帮助。我很幸运地完成了类似的任务并使用了SOURCEDIR属性。YMMV。