从Windows Installer自定义操作执行脚本文件
时间:2020-03-06 14:24:21 来源:igfitidea点击:
作为Windows安装程序项目(标准OOTB VS 2008安装程序项目-vdproj)中的卸载过程的一部分,我需要执行一个批处理文件。人们无法直接从安装程序项目中的"自定义操作"执行bat文件,因此我编写了一个快速的vbs脚本来调用所需的bat文件。
VBS代码:
Set WshShell = WScript.CreateObject( "WScript.Shell" ) command = "uninstall-windows-serivce.bat" msgbox command WshShell.Run ("cmd /C " & """" & command & """") Set WshShell = Nothing
当此脚本独立于卸载程序运行时,它可以完美运行。但是,作为卸载的一部分运行时,它不会执行bat文件(但是会显示消息框,因此我知道vbs文件已被调用)。没有错误报告(至少可以告诉我)。为什么此脚本不能作为"卸载自定义操作"的一部分工作
解决方案
在安装程序类中,我们是否要重写Uninstall方法:
Public Overrides Sub Uninstall(ByVal savedState As System.Collections.IDictionary) MyBase.Uninstall(savedState) 'Shell to batch file here End Sub
其次,我们是否限定了批处理文件的完整路径?
我们是否已检查该脚本所看到的批处理文件在当前目录中?我将添加另一条消息,显示该目录正在使用的目录,以确保它实际上正在尝试执行我们认为它所在的批处理文件。
Windows Installer脚本通常以系统身份运行,除非另有说明。批处理文件是否可能需要由交互式用户运行?
我遇到了同样的问题,问题是我们无法在vbs文件中调用WScript,而只需要调用CreateObject
IE。
Set WshShell = CreateObject( "WScript.Shell" ) command = "uninstall-windows-serivce.bat" msgbox command WshShell.Run ("cmd /C " & """" & command & """") Set WshShell = Nothing
我们分发应用程序所需的范围越广,我建议我们对脚本化自定义操作的建议就越强烈。我过去写过很多书,但是我发现有太多计算机在运行VBScript或者JavaScript时遇到问题。我最终用C ++重写了它们,以处理这种情况。这是几篇文章,深入解释了为什么应避免使用脚本化的自定义操作:
- VBScript(和Jscript)MSI CustomActions很烂
- VBScript(和Jscript)MSI自定义操作(不必)很烂
对我有用的是指定.bat文件的完整路径。