我在安装目录中有一个批处理脚本。我必须在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传递给我的自定义操作?有人可以帮忙吗?
答案 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_RESULT
和REGISTRY_RESULT = {PATH_TO_InstallDir}
并指出正确的一个。