Batch file 在使用WiX卸载应用程序之前,批处理文件未执行
当需要卸载Excel插件时,我尝试运行的批处理文件未执行。我使用以下自定义操作来完成安装后和卸载产品时的操作。以下代码:Batch file 在使用WiX卸载应用程序之前,批处理文件未执行,batch-file,wix,windows-10,windows-installer,Batch File,Wix,Windows 10,Windows Installer,当需要卸载Excel插件时,我尝试运行的批处理文件未执行。我使用以下自定义操作来完成安装后和卸载产品时的操作。以下代码: <CustomAction Id="registeraddin" ExeCommand="[INSTALLFOLDER]RegisterMilerAddIn.bat" Directory="INSTALLFOLDER" Impersonate="no" Execute="deferred" Return="asyncWait" /> <CustomA
<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>
和注销批处理(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
Heat.exe
更新:我不喜欢下面的建议(自定义操作使用),并且(WiX编码器)提醒我(WiX的通用“harvester”/XML标记生成器工具)可能会完成这项工作:
heat.exe文件MyLib.dll-sfrag-suid-ag-out ComInterop.wxs
如果这个方法有效的话——你应该测试一下——你已经从你的WiX安装程序中删除了大量的“噪音”
您需要将生成的COM/注册表信息滑流到主WiX源文件中承载COM互操作文件的组件中。这需要一些谨慎和精确性,并不是很琐碎,但您可以避免许多笨拙的自定义操作风险
您还可以在tlb文件中使用heat.exe:
heat文件MyFile.tlb-sfrag-suid-ag-out ComInterop2.wxs
界面信息似乎被heat.exe
跳过
被认为有害的批处理文件 恕我直言,出于尽力提供帮助的目的:批处理文件在部署时极易出错。它们几乎没有错误控制或处理意外情况的能力。我认为它们在现代部署中是不可取的,我认为这是一个共识。 您应该能够通过exe自定义操作直接调用
regasm.exe
,从而消除所有批处理文件的混乱和复杂性。作为记录:我也不喜欢EXE CAs
足够多的意见。下面是一个基本的EXE CA模型示例,用于插入完整的WiX源()中:
未安装
删除~=“全部”
在研究和尝试了许多不同的属性之后,我找到了解决问题的方法。所以我把它贴在这里,希望它能帮助其他人。我发现我的批处理文件在我可以运行加载项卸载过程之前就被删除了,正如Brian Sutherland逃避的那样。我最终发现在卸载所有文件之前的卸载中执行了以下代码
<InstallExecuteSequence>
<Custom Action="unregisteraddinpostinstall" After="InstallInitialize">REMOVE="ALL"</Custom>
</InstallExecuteSequence>
REMOVE=“全部”
因此,我仍将使用上述代码,但我将实现Stein Asmul的建议,以清理我的流程,而不是使用批处理文件。我仍然在使用
After=“InstallInitialize”
的原因是我的ExcelAddin.dll也是regasm.exe/unregister
过程的一部分,用于删除类型类库。在我运行脚本之前,它也被删除了。在我实现After=“InstallInitialize”>REMOVE=“ALL”之后,脚本将按预期工作。再次感谢布赖恩和斯坦 RemoveFiles是在InstallFiles之前安排的,因此当您尝试运行bat文件时,bat文件不存在。在=“RemoveFiles”之前安排您的操作,您应该学会使用推荐的语法,特别是双引号的位置。例如:SET“WorkFolder=C:\Program Files(x86)\Werner Enterprises\Web Miles Excel Addin”
,SET“\u NET\u Folder=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319”
和“%u NET\u Folder%\regasm.exe”“%WorkFolder%\Miler.ExcelAddin.dll”/Codebase/tlb:“%WorkFolder%\Miler.ExcelAddin.tlb”>“C:\temp\log.txt”
谢谢@BrianSutherland,我试过了,没有再出现错误(我可以看到。卸载将以“删除成功或错误状态:0”退出)。另外,感谢heads up Compo,我写的不是我的脚本,我还没有真正彻底地检查bat语法。我只知道批处理文件在手动启动时执行并执行它应该执行的操作。批处理文件仍然只是注册加载项,但没有成功注销,不幸的是,非常感谢您的建议和示例+1用于通过自定义操作进行安装和卸载。我一直在尝试将我们所有的应用程序从批处理/exe设置转换为使用msi。到目前为止,我很喜欢你能用它做什么,比如你在例子中所展示的。想想看,我在顶部添加了一个新的部分,它基于heat.exe
——一个用于获取WiX标记代码的WiX工具<代码>在确实需要时使用它们。只要有内置功能,就选择它们。当他们说WiX是一条陡峭的学习曲线时,请注意。由于截止日期和我的警告不要破坏我的注册表,我将保留您添加的heat.exe作为将来实施或部署的参考。是否有指向所有参数的文档链接:heat.exe--help
是的,我们都有截止日期。您可以从heat.exe
本身获取参数,是的(在cmd.exe中:heat.exe/?
),并且您可以。我认为heat.exe
在64位COM文件方面存在一些问题(现在可能已经解决)。讨论了我遇到的类似情况。。。还涉及升级情况。
<..>
<!-- 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>
<InstallExecuteSequence>
<Custom Action="unregisteraddinpostinstall" After="InstallInitialize">REMOVE="ALL"</Custom>
</InstallExecuteSequence>