我需要在卸载期间运行可执行文件(.exe)。 .exe文件位于说APPEXTRACTIONPATH文件夹中(值由用户在安装期间提供)。它可行吗?
位置信息也存在于其中一个注册表项中。 是否可以在卸载期间读取注册表,将位置传递给"目录"并从该位置运行.exe文件。请告诉我。提前谢谢!
代码段:
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id="WINDOWSVOLUME" >
<Directory Id="LICENSEFILEPATH" Name="LicenseFileDir">
</Directory>
<Directory Id="APPEXTRACTIONPATH" Name="AppExtractDir">
</Directory>
</Directory>
</Directory>
<CustomAction Id ="ExecuteSomeExe"
Directory ="APPEXTRACTIONPATH"
ExeCommand ="[SystemFolder]cmd.exe /C start SomeExe.exe & exit"
Execute ="deferred"
Impersonate ="no"
Return ="asyncNoWait"
/>
<InstallExecuteSequence>
... ... ...
<Custom Action="ExecuteSomeExe" Before="InstallFinalize">Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
</InstallExecuteSequence>
我还尝试在CustomAction中使用vbscript从注册表项中读取位置后运行.exe文件。该位置读取完美,但执行没有发生。
<CustomAction Id="ExecuteSomeExe"
Execute="deferred"
Script="vbscript"
>
<![CDATA[
On error resume next
Dim WshShell1
Dim WshShell2
Dim appExtractPath
Dim fullExecPath
Set WshShell1 = CreateObject("WScript.Shell")
appExtractPath = WshShell1.RegRead ("HKCU\Software\MyCompany\MyApp\AppExtractionPath")
msgbox "App Extraction Path = "&appExtractPath
Set WshShell2 = WScript.CreateObject("WScript.Shell")
fullExecPath = appExtractPath &"SomeExe.exe"
msgbox "Before running exe from " &fullExecPath
'Running .exe file
WshShell2.Run(fullExecPath)
msgbox "After running exe from " &fullExecPath
'Trying to run in another way
WshShell2.Run "cmd /K CD "&appExtractPath&" & SomeExe.exe"
Set WshShell1 = Nothing
Set WshShell2 = Nothing
]]>
</CustomAction>
答案 0 :(得分:1)
APPEXTRACTIONPATH在卸载时间之前不会被保留,除非你自己保存它,一个WiX记住属性应该适用于此。所以这应该允许你的第一个自定义操作开始,虽然我不明白为什么你需要一个cmd来做到这一点。在我看来,你基本上只需要运行[APPLICATIONPATH] UninstallManager.exe ...
如果您尝试从自己的卸载中调用基于MSI的卸载,则无论您执行什么操作都无法正常工作,因为不允许递归MSI操作(通常会收到错误1618)。
第二个例子:你应该报告从shell run命令返回的结果。同样,我不清楚为什么你不能只运行可执行文件而不是尝试用cmd包装它。此外,第二个示例读取HKCU,并且您说它获得了正确的值,这意味着您可能正在冒充当前用户(或者您不会看到HKCU),以便达到您的模拟自定义操作不会升高的程度,并且运行该卸载可能需要提升。