我需要修改用于"IBM for Windows“的MSI安装程序的安装行为。安装程序是使用InstallShield创建的。在安装过程中,安装程序通过“链接”触发另外两个MSI安装。传递给MSIEXEC.EXE以执行这两个安装的参数由安装中包含的DLL中的自定义操作加载。这些参数以MSI属性结束。
在启动链接安装之前,我希望更改该属性中的值,以操作命令行。这个是可能的吗?如果是这样的话,是怎么做的?创建读取和修改属性的外部DLL没有问题,但我不知道如何将其与现有安装集成--我必须修改哪些表以及如何将DLL放在哪里,
编辑1:为了澄清这一点:我想修改传递给链式安装的参数。它们独立于我传递给主安装的参数,并从安装的一部分DLL加载。
编辑2:我已经上传了普通的MSI +相关的日志文件。我以"/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”调用/qn(第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.
此软件的7.1版本的安装文件在IBM网站上不再可用。只有目前的版本是,而且我还没有调查最新版本是否仍然存在问题,因为业务部门要求我打包v7.1。
发布于 2019-02-27 16:26:26
解决此问题的一种方法是创建一个新的自定义操作,它执行存储在VBScript表中的Binary
代码,并将新的自定义操作放在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
您希望给新的自定义操作一个6种类型,以指示自定义操作数据作为VBScript存储在Binary
表中。自定义操作Source
是对Binary
表中的Name
的引用。自定义操作的Target
值需要是VBScript函数的名称,在本例中是ReplacePropVal
之后,使用与InstallExecutionSequence
表相同的名称将新的自定义操作放置在CustomAction
表中。还要确保给它一个更高的Sequence
值作为ISChainPackagePrepare
。我建议将Sequence
的ISChainPackagePrepare
值增加1,将其放在紧接其后的位置。
更改表并生成新转换之后,只需运行包,并通过在TRANSFORMS
公共属性中指定其路径来应用新的转换,您的属性值就应该被更改。
https://stackoverflow.com/questions/54761131
复制相似问题