使用WiX卸载应用程序之前批处理文件未执行

时间:2018-06-26 20:23:16

标签: batch-file wix windows-10 windows-installer

我需要卸载Excel插件时试图运行的批处理文件未执行。我正在使用以下自定义操作来进行安装后以及卸载产品时的操作。以下代码:

  <CustomAction Id="registeraddin" ExeCommand="[INSTALLFOLDER]RegisterMilerAddIn.bat" Directory="INSTALLFOLDER" Impersonate="no" Execute="deferred" Return="asyncWait" />
  <CustomAction Id="unregisteraddinpostinstall" ExeCommand="[INSTALLFOLDER]UnRegisterMilerAddIn.bat" Directory="INSTALLFOLDER" Impersonate="no" Execute="deferred" Return="asyncWait" />

  <InstallExecuteSequence>
    <Custom Action="registeraddin" After="InstallFiles">NOT Installed</Custom>
    <Custom Action="unregisteraddinpostinstall" After="InstallFiles">Installed AND (REMOVE = "ALL")</Custom>
  </InstallExecuteSequence>

在日志中产生此错误:

  

MSI(s)(44:04)[11:29:00:437]:执行操作:   ActionStart(Name = unregisteraddinpostinstall ,,

     

MSI(s)(44:04)[11:29:00:437]:执行操作:   CustomActionSchedule(Action =取消注册后安装,ActionType = 1058,Source = C:\ Program   文件(x86)\ Werner Enterprises \ Web Miles Excel   Addin \,Target = C:\ Program Files(x86)\ Werner Enterprises \ Web Miles   Excel Addin \ UnRegisterMilerAddIn.bat,)

     

MSI(s)(44:04)[11:29:00:846]:注意:1:1722 2:   unregisteraddinpostinstall 3:C:\ Program Files(x86)\ Werner   企业\ Web Miles Excel加载项\ 4:C:\ Program Files(x86)\ Werner   Enterprises \ Web Miles Excel Addin \ UnRegisterMilerAddIn.bat

     

MSI(s)(44:04)[11:29:00:846]:注意:1:2205 2:3:错误MSI(s)   (44:04)[11:29:00:846]:注意:1:2228 2:3:错误4:选择Message   从ErrorError = 1722 CustomAction   unregisteraddinpostinstall返回实际错误代码100(请注意,   如果在沙箱中进行翻译,则可能不会100%准确)

     

MSI(s)(44:04)[11:29:10:900]:注意:1:2205 2:3:错误MSI(s)   (44:04)[11:29:10:900]:注意:1:2228 2:3:错误4:选择Message   从ErrorError = 1709

     

MSI(s)(44:04)[11:29:10:900]:产品:WebMiles_Addin_Installer-   错误1722。此Windows Installer软件包存在问题。一种   作为安装程序一部分运行的程序未按预期完成。联系   您的支持人员或包装供应商。行动   unregisteraddinpostinstall,位置:C:\ Program Files(x86)\ Werner   Enterprises \ Web Miles Excel Addin \,命令:C:\ Program Files   (x86)\ Werner Enterprises \ Web Miles Excel   Addin \ UnRegisterMilerAddIn.bat

这个错误对我来说是晦涩的。我也没有在我的批处理文件中做真正的花哨的东西。 Excel加载项的 安装 有效 (这是此应用程序的前提)。但是显然,我无法以相同的方式卸载该插件,因此日志中的上述错误也会消失。

为完整起见,这是我的注册批处理的内容(RegisterMilerAddIn.bat):

SET WorkFolder= "C:\Program Files (x86)\Werner Enterprises\Web Miles Excel Addin"

SET _NET_4_Folder= %WinDir%"\Microsoft.NET\Framework\v4.0.30319"

%_NET_4_Folder%\regasm.exe %WorkFolder%\Miler.ExcelAddin.dll /Codebase /tlb:%WorkFolder%\Miler.ExcelAddin.tlb >> C:\temp\log.txt

并取消注册批处理(UnRegisterMilerAddIn.bat):

SET WorkFolder= "C:\Program Files (x86)\Werner Enterprises\Web Miles Excel Addin"

SET _NET_4_Folder= %WinDir%"\Microsoft.NET\Framework\v4.0.30319"

%_NET_4_Folder%\regasm.exe /unregister %WorkFolder%\Miler.ExcelAddin.dll /Codebase /tlb:%WorkFolder%\Miler.ExcelAddin.tlb >> C:\temp\log.txt

2 个答案:

答案 0 :(得分:1)

Heat.exe

UPDATE :我不喜欢下面的建议(自定义操作用法),Bob Arnson(WiX编码器)提醒我{{3 }}(WiX的通用“收割机” / XML标记生成器工具)可以完成这项工作:

heat.exe file MyLib.dll -sfrag -suid -ag -out ComInterop.wxs

如果此方法有效(您应进行测试),则已从WiX安装程序中删除了很多“旧块”。

您需要将生成的COM /注册表信息整合到主WiX源文件中的承载COM Interop文件的组件中。这需要一定的关注和精确度,而且并不琐碎,但是您可以避免很多笨拙的自定义操作风险。

您还可以Heat.exe tlb文件:

heat file MyFile.tlb -sfrag -suid -ag -out ComInterop2.wxs

heat.exe似乎跳过了界面信息。


批处理文件被认为有害

在所有适当的尊重下,并试图提供帮助:批处理文件极易出错,易于部署。它们几乎没有错误控制或处理意外情况的能力。我认为它们不适用于现代部署,并且我认为这是共识。

您应该能够通过EXE自定义操作直接调用regasm.exe-消除了所有批处理文件的混乱和复杂性。记录:我也不喜欢EXE CA。

足够的意见。这是EXE CA的基本模型示例,可用于插入完整的WiX源(heat.exe):

<..>

    <!-- AppSearch to find regasm.exe -->

    <Property Id="REGASM4" Secure="yes">
        <DirectorySearch Id="RegAsmPathx86" Path="[WindowsFolder]Microsoft.NET\Framework\v4.0.30319">
            <FileSearch Name="regasm.exe" />
         </DirectorySearch>
    </Property>

<..>

    <!-- Run regasm.exe CAs -->

    <CustomAction Id="Install" Directory="SystemFolder"
                  ExeCommand="&quot;[REGASM4]&quot; &quot;[MyAPP]ClassLib.dll&quot; /Codebase /silent /tlb:&quot;[MyAPP]ClassLib.tlb&quot;"
                  Execute="deferred" Impersonate="no" />

    <CustomAction Id="Uninstall" Directory="SystemFolder"
                  ExeCommand="&quot;[REGASM4]&quot; /unregister &quot;[MyAPP]ClassLib.dll&quot; /Codebase /silent /tlb:&quot;[MyAPP]ClassLib.tlb&quot;"
                  Execute="deferred" Impersonate="no" />
 <..>

   <!-- Sequenced And Conditioned CAs -->

    <InstallExecuteSequence>
        <Custom Action="Install" After="InstallFiles">Not Installed</Custom>
        <Custom Action="Uninstall" Before="RemoveFiles">REMOVE~="ALL"</Custom>
    </InstallExecuteSequence>

答案 1 :(得分:0)

在研究并尝试了许多不同的技巧之后,我找到了解决问题的方法。所以我在这里发布它可能对其他人有帮助。我发现我的批处理文件已被删除,然后才能运行外接程序卸载过程,就像Brian Sutherland逃避的那样。我终于发现在删除所有文件之前的卸载中一次执行以下代码。

<InstallExecuteSequence>
    <Custom Action="unregisteraddinpostinstall" After="InstallInitialize">REMOVE="ALL"</Custom>
  </InstallExecuteSequence>

因此,我仍将使用上面的代码,但是我将实现Stein Asmul的建议来清理进程,而不使用批处理文件。我仍然使用After="InstallInitialize"的原因是我的ExcelAddin.dll也是regasm.exe /unregister删除类型类库的过程的一部分。在运行脚本之前,它也已被删除。在实现After =“ InstallInitialize”> REMOVE =“ ALL”之后,脚本将按预期运行。再次感谢Brian和Stein!