我需要卸载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
从Error
到Error
= 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
从Error
到Error
= 1709MSI(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
答案 0 :(得分:1)
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=""[REGASM4]" "[MyAPP]ClassLib.dll" /Codebase /silent /tlb:"[MyAPP]ClassLib.tlb""
Execute="deferred" Impersonate="no" />
<CustomAction Id="Uninstall" Directory="SystemFolder"
ExeCommand=""[REGASM4]" /unregister "[MyAPP]ClassLib.dll" /Codebase /silent /tlb:"[MyAPP]ClassLib.tlb""
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!