从自定义文件夹位置卸载期间运行exe文件

时间:2016-01-12 13:00:26

标签: directory wix exe custom-action uninstaller

我需要在卸载期间运行可执行文件(.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 &amp; 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>

1 个答案:

答案 0 :(得分:1)

APPEXTRACTIONPATH在卸载时间之前不会被保留,除非你自己保存它,一个WiX记住属性应该适用于此。所以这应该允许你的第一个自定义操作开始,虽然我不明白为什么你需要一个cmd来做到这一点。在我看来,你基本上只需要运行[APPLICATIONPATH] UninstallManager.exe ...

如果您尝试从自己的卸载中调用基于MSI的卸载,则无论您执行什么操作都无法正常工作,因为不允许递归MSI操作(通常会收到错误1618)。

第二个例子:你应该报告从shell run命令返回的结果。同样,我不清楚为什么你不能只运行可执行文件而不是尝试用cmd包装它。此外,第二个示例读取HKCU,并且您说它获得了正确的值,这意味着您可能正在冒充当前用户(或者您不会看到HKCU),以便达到您的模拟自定义操作不会升高的程度,并且运行该卸载可能需要提升。