您不能覆盖MsiExec的文本。您只能覆盖MSI表中的一些消息“Error”和“ActionText”,后者用于显示进度条的安装过程中的消息。
最重要的是,在“错误”表中的编号是内部编号和无关具有返回错误代码:
随着维克斯可以覆盖表的内容“错误“但正如你可以在你的链接或例子msi文件中看到的那样,特别是编号是自己的编号,并且与返回码(0,1603,3010,1642,...)及其消息无关。我认为,这些错误消息中的大部分都是针对日志文件中的输出的,但我认为,它们也会在对话框中显示出来,所以必须尝试一下。
对于返回错误代码1642,适当的文本不在该表中。有补丁相关的错误消息,如没有。 1328举例说明,但它们适用于其他场景。
但通常你不会让用户通过双击或自己输入msiexec命令来启动,是吗? 取而代之的是这样做的批处理/脚本/ setup.exe或安装程序服务。
在那里你必须包装消息。许多安装都是这样做的,并且开始安装本身,例如静音与“msiexec /quiet
”或“msiexec /qn
”
简体批次例如:(结构化当然更好的if/else,但是这取决于你想给自己的消息,这些消息的返回码)
call msiexec /i "c:\mypath\mysetup.msi" /qn /L*v "c:\mylog.log"
SET SetupSuccess=%ERRORLEVEL%
if '%SetupSuccess%' EQU '0' echo Yes, setup successful.
if '%SetupSuccess%' EQU '1642' (
echo.
echo "You must install my product before installing this patch."
)
我确实有一个启动msiexec的可执行文件,但它以完整的UI运行,因此用户将看到错误消息。我想我可以在尝试安装修补程序之前检查目标产品是否存在。它似乎是多余的。 – chickenpie 2014-10-02 12:01:18
Windows安装程序会在修补程序执行任何操作之前发现该错误。如果未安装目标产品,则Windows会处理该问题,而不是您。如果您用可执行文件打包补丁程序,首先看到您的产品代码是否已安装,那么您可以创建自己的消息。更进一步,看看安装的版本是否低于你的补丁版本,如果你想说它不适用(或已经安装)用你自己的话。 MsiGetProductInfo()和MsiApplyPatch() – PhilDW 2014-10-02 20:01:56
是的,我同意PhilDW。这不是多余的,而是一个很好的检查方法。一个特定的测试功能(如果该补丁适用)是MsiDeterminePatchSequence()。我自己并没有使用它,但是在第二次阅读文档后,似乎没有那么不方便,因为在第一次阅读之后。 :-) – Philm 2014-10-03 14:15:08