我需要修改“ IBM i Access Windows版”的MSI安装程序的安装行为。该设置是使用InstallShield创建的。在安装过程中,安装程序通过“链接”触发了另外两个MSI安装。传递给MSIEXEC.EXE来执行这两个安装的参数是通过自定义操作从安装附带的DLL中加载的。参数最终以MSI属性结束。
我想在启动链式安装之前更改该属性中的值以操作命令行。这可能吗?如果是这样,怎么办?创建读取并修改该属性的外部DLL没问题,但是我对如何将其与现有安装集成感到迷惑不解-我必须修改哪些表以及如何将DLL放在哪里, ...
编辑1 :为了阐明这一点:我想修改传递给链接的MSI安装的参数。它们与我传递给主安装程序的参数无关,并且是从安装程序一部分的DLL中加载的。
编辑2 :我已经上传了简单的MSI和相关的log file。我使用“ / qn”启动主安装以禁止显示所有消息。这样做没有问题,链接的安装将在没有可见提示的情况下执行。卸载软件(再次使用“ / qn”)时出现问题。从DLL中加载远程自定义操作(行6417):
MSI (s) (10:28) [09:00:45:643]: Invoking remote custom action. DLL: C:\Windows\Installer\MSIA4BD.tmp, Entrypoint: ISChainPackages
从DLL加载的命令行指定使用参数“ / qb”而不是“ / qn”来调用MSIEXEC.EXE(第6958行):
MSI (s) (10!60) [09:00:46:033]: PROPERTY CHANGE: Adding IS_CHAINER_POST_COMMANDLINE property. Its value is '/l"c:\temp\IBM_iAccess_7.1_Uninstall.log" /qb /x{CCA40632-843E-48C6-B14F-E1070015D87C} ...
并且由于MSI安装程序对文件有锁定,因此由链式MSI的卸载引起的消息框弹出(行44046):
MSI (s) (10:C0) [09:01:05:553]: RESTART MANAGER: Did detect that the custom action server with process ID 2352 holds file[s] in use, so a reboot will be necessary.
MSI (s) (10:C0) [09:01:05:553]: Note: 1: 1610
MSI (s) (10:C0) [09:01:11:224]: RESTART MANAGER: The user chose to go on with the installation, although a reboot will be required.
The setup must update files or services that cannot be updated while the system is running. If you choose to continue, a reboot will be required to complete the setup.
IBM website上不再提供该软件7.1版的安装文件。只有当前版本,并且由于业务部门要求我打包v7.1,所以我没有调查问题是否仍然存在于最新版本中。
答案 0 :(得分:2)
解决此问题的一种方法是创建一个新的自定义操作,该自定义操作执行存储在Binary
表中的VBScript代码,并将新的自定义操作放在ISChainPackagePrepare
之后。 VBScript代码将读取IS_CHAINER_POST_COMMANDLINE
的值,并按照Replace()
函数
VBScript代码可能如下所示:
Option Explicit
Function ReplacePropVal()
dim propvalue
dim newvalue
propvalue = Session.Property("IS_CHAINER_POST_COMMANDLINE")
newvalue = Replace(propvalue,"/qb","/qn")
Session.Property("IS_CHAINER_POST_COMMANDLINE") = newvalue
End Function
您要给新的“自定义操作”一个Type of 6,以指示您的“自定义操作”数据已作为VBScript存储在Binary
表中。您的自定义操作Source
是对Name
表中Binary
的引用。您的“自定义操作”的Target
值必须是VBScript函数的名称,在这种情况下为ReplacePropVal
然后,将新的“自定义操作”以与InstallExecutionSequence
表中相同的名称放置在CustomAction
表中。另外,请确保为其赋予较高的Sequence
值,以ISChainPackagePrepare
为单位。我建议将Sequence
的{{1}}值加1后立即放置。
更改表并生成新转换后,只需在ISChainPackagePrepare
公共属性中指定其路径,然后运行应用了新转换的包,然后更改属性值即可。
答案 1 :(得分:0)
我认为这里的理想方法是转换链式包装的定义。 UI级别(documentation)存储在 ISChainPackage 表的first two bits of the Options column中,因此您所需要做的就是更改该值。特别是,您可以将那些位从 ecoUIBasic (0)更改为 ecoUINone (1),这很简单,只需将当前值加1。 ecoUIReduced (2)和 ecoUIFull (3)也可用。
如果正确更改了ISChainPackage.Options,将为您生成所需的<div class="wrapper">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>
,并且您无需添加辅助自定义操作即可将IS_CHAINER_POST_COMMANDLINE
更改为/qb
之后。 (对于建议该功能的变通办法,sevi表示感谢。)
答案 2 :(得分:-1)
如果这是Advanced or Suite UI Setup.exe,请检查 有关如何传递属性的链接。
打包数据库条目 (iAccess和其他软件的软件重新打包提示):
方法 :此DLL自定义操作有什么作用?它会创建许可证密钥吗?通常,这些事情以前已经被发现并解决过很多次。为了对此进行检查,我通常使用以下方法来找到解决方案:
Large Scale Deployment.chm
”,“ Installation Command Line Parameters.chm
”等...或现成的转换或命令行文件示例( {{ 1}} )。Install.cmd
。一些看起来相关的条目,here is one)。请参阅下面有关文件提取的部分。
Setup.exe开关 :我在这里有一个相似或相关的答案,在这里我还提到了setup.exe命令行开关:Silent run installer (.exe) with parameters on Windows。>
记录 :如果自定义操作未创建动态内容(唯一的许可证密钥,计算机锁定身份等),则可以尝试查找什么是由logging the setup生成的,并在日志文件中查找使用的命令行。模拟样例:
look at the IBM entries
文件提取 :这是 Installshield Suite项目吗?您是先提取嵌入式文件和MSI文件吗?:Programmatically extract contents of InstallShield setup.exe。
Setup.exe中的什么? :Installshield setup.exe文件可以有很多不同的东西(解释不同的setup.exe口味):{{3 }}。
链接 :