我无法使用WIX安装程序执行V​​BScript。目前,我有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脚本(不是从安装程序执行的),并且可以正常工作。有人知道我做错了吗?

最佳答案

我想总结几个问题:
  
  
  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带有功能IsEmptyIsNullIsObject


在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”。

检查退出代码:最后,设置为检查退出代码的任何自定义操作都可能会使您的设置进入中止(立即模式)或回滚(延迟模式)的状态。如果自定义操作无法运行,则仅在必须结束安装时才检查退出代码。



问题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


In Wix MSI: Killing a process upon uninstallation
Kill windows service forcefully in WIX(朝下)
使用WMI / VBScript终止进程
某些人通过taskill.exe and WiX(CAQuietExec:隐藏命令行窗口)将Quiet Execution Custom Action组合在一起。 FireGiant documentation


我不确定要推荐哪个选项。我完全不喜欢杀死进程的概念,但是我猜有时候没有其他选择。

关于java - WIX安装程序从CustomAction执行vbscript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51947460/

10-13 07:58