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

Running exe file during uninstallation from a customized folder location

我需要在卸载过程中运行 一个可执行文件 (.exe)。 .exe 文件位于 APPEXTRACTIONPATH 文件夹中(值由用户在安装期间提供)。可行吗?

位置信息也存在于其中一个注册表项中。 是否可以在卸载期间读取注册表,将位置传递给 "Directory" 并从该位置 运行 .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>

APPEXTRACTIONPATH 直到卸载时才会被保留,除非您自己保留它,WiX 记住 属性 应该可以做到这一点。所以这应该允许您开始第一个自定义操作,尽管我不明白为什么您需要 cmd 来执行此操作。在我看来,你基本上只需要 运行 [APPLICATIONPATH]UninstallManager.exe ...

如果您尝试从您自己的卸载中调用 MSI-based 卸载,那么无论您做什么它都不会起作用,因为递归 MSI 操作是不允许的(您通常会收到错误 1618)。

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