WIX-如何将从注册表读取的文件位置传递给自定义操作?

时间:2018-08-10 10:20:52

标签: wix custom-action

我在安装目录中有一个批处理脚本。我必须在MSI卸载过程中执行此批处理脚本。

首先,要知道Install目录的位置,我正在使用下面的代码进行RegistrySearch

 <Property Id="REGISTRY_RESULT">
          <RegistrySearch Id="MyRegistrySearch" 
              Root="HKCU" 
              Key="Software\InstallPath" 
              Name="path"
              Type="raw" />
 </Property>

我已经创建了自定义操作来调用批处理脚本。

    <SetProperty Id="CMD" Value="C:\Windows\System32\cmd.exe" Before="CostFinalize" />
    <CustomAction Id="RunBat" Property="CMD" Execute="deferred" Impersonate="no" Return="check"  ExeCommand="[**??REGISTRYSEARCH??**}\RunBat.bat"/>

自定义操作已将一个属性设置为“ CMD”。现在,如何将REGISTRY_RESULT传递给我的自定义操作?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

这是我设法做到的方式(不使用SetProperty):

<Property Id="REGISTRY_RESULT">
  <RegistrySearch Id="MyRegistrySearch"
      Root="HKLM"
      Key="Software\MyProgram"
      Name="InstallDir"
      Type="raw"/>
</Property>

<CustomAction Id="RunBat" Directory="INSTALLFOLDER" Execute="deferred" Impersonate="no" Return="check"  ExeCommand="[SystemFolder]cmd.exe /C [REGISTRY_RESULT]\RunBat.bat"/>

这是我创建的test wix项目的完整代码,以备不时之需:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="ConsoleApp" Language="1033" Version="1.0.0.0" Manufacturer="SoftwareCompany" UpgradeCode="8b78c2e7-47cf-4b25-a0f9-4b648db7336e">
        <Package InstallerVersion="500" Compressed="yes" InstallScope="perMachine" />
        <MediaTemplate EmbedCab="yes"/>

        <Feature Id="ProductFeature" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
        </Feature>

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="ConsoleApp" />
      </Directory>
    </Directory>

    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      <Component Id="cmpConsoleApp.exe" Guid="*">
        <File Id="ConsoleApp.exe" KeyPath="yes" Source="d:\Learning\WIX\WixTraining\ConsoleApp\bin\Debug\ConsoleApp.exe" />
      </Component>
    </ComponentGroup>

    <Property Id="REGISTRY_RESULT">
      <RegistrySearch Id="MyRegistrySearch"
          Root="HKLM"
          Key="Software\MyProgram"
          Name="InstallDir"
          Type="raw"/>
    </Property>

    <CustomAction Id="RunBat" Directory="INSTALLFOLDER" Execute="deferred" Impersonate="no" Return="check"  ExeCommand="[SystemFolder]cmd.exe /C [REGISTRY_RESULT]\RunBat.bat"/>

    <InstallExecuteSequence>
      <Custom Action="RunBat" Before="InstallFinalize">NOT Installed</Custom>
    </InstallExecuteSequence>

    </Product>
</Wix>

请注意我是如何编写CustomAction的,我没有指定属性属性,而是使用Directory(Wix强制您具有Directory属性),我还使用了ExeCommand="[SystemFolder]cmd.exe /C [REGISTRY_RESULT]\RunBat.bat",这基本上意味着从{{ 1}}(cmd.exe)并运行位于SystemFolder文件夹中的批处理文件C:\Windows\System32\cmd.exe

这对我有用,如果您仍然无法运行批处理文件,我认为您的RunBat.bat可能存在一些问题,建议您在启用日志记录的情况下运行msi文件(打开REGISTRY_RESULT,然后键入RegistrySearch),然后查看log.txt并搜索cmd属性,如果一切正常,则应该看到一行msiexec /i "PATH_TO_YOUR_MSI" /L*V "log.txt",如果看不到该行,可能是此键不存在,请确保您没有混淆REGISTRY_RESULTREGISTRY_RESULT = {PATH_TO_InstallDir}并指出正确的一个。