我需要修改“IBM i Access for 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”(第6958行)调用MSIEXEC.EXE:
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。
解决此问题的一种方法是创建一个新的自定义操作,执行存储在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
的ISChainPackagePrepare
值增加1,然后将其放置。
在更改表并生成新转换后,只需通过在TRANSFORMS
公共属性中指定其路径来运行包含新转换的包,并且应更改属性值。
我认为这里理想的方法是转换链式包定义。 UI级别(documentation)存储在ISChainPackage表的first two bits of the Options column中,因此您需要做的就是改变该值。特别是,您可以将这些位从ecoUIBasic(0)更改为ecoUINone(1),这应该与向当前值添加1一样简单。还有ecoUIReduced(2)和ecoUIFull(3)。
如果正确更改了ISChainPackage.Options,将为您生成所需的IS_CHAINER_POST_COMMANDLINE
,之后您不必添加辅助自定义操作以将/qb
更改为/qn
。 (感谢sevi建议使用功能性解决方法。)
如果这是Advanced or Suite UI Setup.exe,请检查该链接以了解如何通过酒店。
包数据库条目(iAccess和其他软件的软件重新打包提示):
方法:此DLL自定义操作有何作用?它是否创建了许可证密钥?通常这些东西之前已被发现并解决了很多次。为了检查这一点,我通常使用这些方法来寻找解决方案:
Large Scale Deployment.chm
”,“Installation Command Line Parameters.chm
”等...或现成的变换或命令行文件样本(Install.cmd
)。look at the IBM entries
。几个看起来相关的条目,here is one)。请参阅下面的文件提取部分。
Setup.exe开关:我在这里有类似或相关的答案,其中我还提到了setup.exe命令行开关:Silent run installer (.exe) with parameters on Windows。
记录:如果自定义操作没有创建动态(唯一许可证密钥,机器锁定标识等),那么您可以尝试查找logging the setup生成的内容并查找日志文件中使用的命令行。模拟样本:
MSI (s) (AC:00) [00:00:00:00]: Command Line: TARGETDIR=C:\ SHORTCUTDIR=C:\Documents and Settings\All Users\Start Menu\Programs\Test ACTION=INSTALL
文件提取:这是一个Installshield Suite项目吗?你是先提取嵌入文件和MSI文件吗?:Programmatically extract contents of InstallShield setup.exe。
什么是Setup.exe?:Installshield setup.exe文件可以有很多不同的东西(不同setup.exe风格的解释):Regarding silent installation using Setup.exe generated using Installshield 2013 (.issuite) project file。
链接: