如何检测MSI命令行中是否传入CUSTOM_DIR参数?
MSI自定义安装目录的Wix配置问题解答
场景说明
在Windows系统中使用msiexec安装MSI文件,支持两种安装路径模式:
- 默认安装:自动部署到ProgramFiles目录,命令示例:
msiexec /i installer_name.msi ALLUSERS=1 - 自定义目录:通过
CUSTOM_DIR参数指定路径,命令示例:msiexec /i installer_name.msi CUSTOM_DIR="C:\TEST" ALLUSERS=1
为实现该逻辑,在Wix文件中配置了两个自定义操作的执行条件:
- 传入
CUSTOM_DIR时的配置:<Custom Action='InstallAppCustom' Before='InstallFinalize'>VersionNT64 and (CUSTOM_DIR) and (ALLUSERS=1)</Custom> - 未传入
CUSTOM_DIR时的配置:<Custom Action='InstallApp' Before='InstallFinalize'>VersionNT64 and (Not CUSTOM_DIR) and (ALLUSERS=1)</Custom>
问题与解答
1. 当前检测CUSTOM_DIR是否传入的方式是否正确?有没有更合适的方法?
当前的检测方式不正确。MSI的条件判断规则是:只要属性存在(哪怕是空字符串),PropertyName形式的条件会返回True;只有属性完全未定义时,PropertyName才返回False。而通过命令行传入参数时,哪怕传空值(如CUSTOM_DIR=),属性也会被创建,导致Not CUSTOM_DIR永远不成立。
更合适的检测方法是判断属性值是否非空,推荐两种写法:
- 检测传入有效路径的条件:
VersionNT64 and (CUSTOM_DIR <> "") and (ALLUSERS=1) - 检测未传入或传入空值的条件:
VersionNT64 and (CUSTOM_DIR = "") and (ALLUSERS=1)
同时建议在Wix中提前定义CUSTOM_DIR为公共属性,确保命令行参数能正确传递:
<Property Id="CUSTOM_DIR" Value="" Public="yes" />
2. 为什么无论是否传入CUSTOM_DIR,InstallAppCustom都会执行?
核心原因是当前条件(CUSTOM_DIR)只要属性存在就返回True——即使你没传参数,Wix或MSI可能已经默认创建了空值的CUSTOM_DIR属性,导致条件始终成立,InstallAppCustom每次都会执行。
解决步骤:
- 把
InstallAppCustom的条件修改为VersionNT64 AND (CUSTOM_DIR <> "") AND (ALLUSERS=1) - 把
InstallApp的条件修改为VersionNT64 AND (CUSTOM_DIR = "") AND (ALLUSERS=1) - 确认
CUSTOM_DIR已定义为公共属性(参考上面的Property配置) - 检查两个自定义操作的类型,确保没有设置为无条件执行的类型
内容的提问来源于stack exchange,提问作者hago
相关产品推荐
相关产品推荐

