WiX中如何访问已采集文件夹内的可执行文件?
问题分析与解决方案
核心问题
你遇到的问题根源有两点:
- 手动拼接路径时大概率缺少路径分隔符,导致生成的文件路径无效
- 延迟执行(deferred)的自定义操作无法直接访问普通属性,
HARVESTEDFOLDER这类属性在deferred阶段无法直接读取,必须通过CustomActionData传递
另外,手动拼接路径本身就容易出错,WIX提供了更可靠的文件引用方式,优先推荐使用。
最优方案:用文件标识符直接引用路径
WIX支持通过文件的Id自动获取其安装后的完整路径,完全不需要手动拼接,不管SuppressRootDirectory设置如何,都能精准定位文件:
- 在harvest生成的wxs文件里,给
run_it.cmd指定一个清晰的File Id(如果harvest自动生成的Id太杂乱,手动修改成易读的名称):
<File Id="RunItCmd" Source="$(var.HarvestedFolderPath)\run_it.cmd" />
- 修改自定义操作,直接用
[#RunItCmd]引用该文件的完整安装路径:
<CustomAction Id="RunIt" Directory="INSTALLFOLDER" ExeCommand="[#RunItCmd]" Execute="deferred" Impersonate="no" Return="asyncNoWait" />
- 确保自定义操作在
InstallFiles之后执行(此时文件已经被复制到目标目录):
<InstallExecuteSequence> <Custom Action="RunIt" After="InstallFiles">NOT Installed</Custom> </InstallExecuteSequence>
若坚持用属性拼接路径的修正方法
如果一定要通过HARVESTEDFOLDER属性拼接路径,需要解决deferred操作的属性传递问题:
- 先创建一个即时自定义操作,把需要的属性存入目标自定义操作的
CustomActionData:
<CustomAction Id="SetRunItData" Property="RunIt" Value="INSTALLFOLDER=[INSTALLFOLDER];HARVESTEDFOLDER=[HARVESTEDFOLDER]" />
- 修改延迟自定义操作,通过
CustomActionData读取变量,同时补上路径分隔符避免拼接错误:
<CustomAction Id="RunIt" Directory="INSTALLFOLDER" ExeCommand="[CustomActionData]INSTALLFOLDER\[CustomActionData]HARVESTEDFOLDER\run_it.cmd" Execute="deferred" Impersonate="no" Return="asyncNoWait" />
- 在安装序列中调整执行顺序,先执行属性设置操作,再执行自定义操作:
<InstallExecuteSequence> <Custom Action="SetRunItData" Before="RunIt">NOT Installed</Custom> <Custom Action="RunIt" After="InstallFiles">NOT Installed</Custom> </InstallExecuteSequence>
内容的提问来源于stack exchange,提问作者AdamJ
相关产品推荐
相关产品推荐

