我无法使用WIX安装程序执行VBScript。目前,我拥有WiX配置的这一部分:
<Binary Id='KillThatProcessBinary' SourceFile='KillThatProcess.vbs' />
<CustomAction Id="KillThatProcessAction"
Execute="immediate"
BinaryKey='KillThatProcessBinary'
VBScriptCall='KillThatProcessFunction'
Return="check"/>
<InstallExecuteSequence>
<Custom Action='KillThatProcessAction' Before='InstallValidate'/>
<ScheduleReboot After="InstallFinalize"/>
</InstallExecuteSequence>
此VBS脚本( KillThatProcess.vbs
):
Public Function KillThatProcessFunction()
Set oShell = WScript.CreateObject("WSCript.shell")
oShell.run "cmd /C wmic process where ""name like '%java%'"" delete"
Return 0
End Function
我已经尝试将此脚本插入到CustomAction中(作为innerText),并添加属性:Script =“ vbscript”。但是什么都没用,每次我收到错误消息-“ 此Windows Installer程序包都有问题。为此安装所需的脚本无法运行。请与支持人员或程序包供应商联系。“
以及日志文件中的错误:
Error 0x80070643: Failed to install MSI package.
[1A88:2FA4][2018-08-21T14:11:17]e000: Error 0x80070643: Failed to configure per-user MSI package.
[1A88:2FA4][2018-08-21T14:11:17]i319: Applied execute package: LPGateway, result: 0x80070643, restart: None
[1A88:2FA4][2018-08-21T14:11:17]e000: Error 0x80070643: Failed to execute MSI package.
我已经执行了该vbs脚本(不是从安装程序执行的),并且可以正常工作。有人知道我做错了吗?
答案 0 :(得分:1)
我要总结几个问题:
- VBA和VBScript函数 :VBScript看起来实际上是VBA,并且在MSI中调用VBScript需要一些调整 正确调用VBScript函数。
- 重启 :您计划的重启必须具有更好的条件,以避免意外重启。
- 进程终止 :您要终止哪些进程?
- 海拔 :如果升高,则需要执行杀死的升高才能成功。您的每用户设置可能未设置为 完全提升(因此您通常只能结束以您自己的身份运行的进程)。
- 重启管理器 :由于Windows具有Windows的重启管理器功能,因此您通常不需要杀死进程。 安装程序尝试使用。 Attempt to explain this feature(查找 黄色部分)。
问题1 :必须是VBA脚本而不是VBScript吗?记录:我没见过在VBScript中是return
?在VBScript中,您可以通过将函数名称设置为等于您要返回的名称来快速返回函数,
result = IsEmptyString("")
MsgBox CStr(result)
Function IsEmptyString(str)
If str = "" Then
IsEmptyString = True
Else
IsEmptyString = False
End If
End Function
注意 :以上只是一个愚蠢的,毫无意义的示例。有关更详尽的检查,请尝试 IsBlank from ss64.com。 VBScript带有功能IsEmpty和IsNull和IsObject。
在MSI文件中使用时,我通常不会在VBScript中添加功能,而是直接运行脚本,因此运行此VBScript应该可以:
MsgBox(Session.Property("ProductName"))
将其插入WiX源(注意未指定任何函数调用):
<Binary Id='Sample.vbs' SourceFile='Sample.vbs' />
<CustomAction Id='Sample.vbs' VBScriptCall='' BinaryKey='Sample.vbs' Execute='immediate' Return='ignore'/>
至关重要的是,您的VBScript仍然可以调用同一VBScript文件中可用的其他函数。因此,在上面的示例中,可以从文件顶部的主要“无名”功能调用“ IsEmptyString ”。
检查退出代码 :最后,设置为检查退出代码的任何自定义操作都可以将您的设置置于 abort (立即模式)或回滚(延迟模式)。如果自定义操作无法运行,则必须结束设置,我只会检查退出代码。
问题2:重新启动 。我认为这是一个非常严重的问题。我已经看到人们大批出门,因为它们在大规模部署期间会导致意外重启。重新启动知识工作者的PC(及其管理器),同时打开十二个Visual Studio窗口,数十个浏览器窗口以及Word和Excel,然后命名。它会引起很多问题。他们可能知道您的住所! :-)
请阅读以下答案(至少在开始时有3个要点): Reboot on install, Don't reboot on uninstall
问题3:进程终止 。如上所述,进程的终止与重新启动问题有关。如上面的链接中所述,如果进程符合Windows Restart Manager的要求,则不一定总是要终止进程。 Let me repeat it here(黄色部分应该为您提供要点,尤其是我认为的第二部分)。
杀死进程有几种不同的方法。请注意,最常见的问题可能是您没有杀死该进程的访问权和/或特权,无论您使用哪种工具或方法来杀死它。
也许您可以在Util模式中尝试使用 CloseApplication功能:http://wixtoolset.org/documentation/manual/v3/xsd/util/closeapplication.html
我不确定建议使用哪个选项。我完全不喜欢杀死进程的概念,但是我猜有时候没有其他选择。