WIX安装程序从CustomAction执行vbscript

时间:2018-08-21 11:14:14

标签: java wix windows-installer

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

1 个答案:

答案 0 :(得分:1)

  

我要总结几个问题:

     
      
  1. VBA和VBScript函数 :VBScript看起来实际上是VBA,并且在MSI中调用VBScript需要一些调整   正确调用VBScript函数。
  2.   
  3. 重启 :您计划的重启必须具有更好的条件,以避免意外重启。
  4.   
  5. 进程终止 :您要终止哪些进程?      
        
    • 海拔 :如果升高,则需要执行杀死的升高才能成功。您的每用户设置可能未设置为   完全提升(因此您通常只能结束以您自己的身份运行的进程)。
    •   
    • 重启管理器 :由于Windows具有Windows的重启管理器功能,因此您通常不需要杀死进程。   安装程序尝试使用。 Attempt to explain this feature(查找   黄色部分)。
    •   
  6.   

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

检查退出代码 :最后,设置为检查退出代码的任何自定义操作都可以将您的设置置于 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

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