【问题标题】:WIX installer execute vbscript from CustomActionWIX 安装程序从 CustomAction 执行 vbscript
【发布时间】:2019-01-27 13:40:54
【问题描述】:

我无法使用 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 脚本(不是来自安装程序)并且它可以工作。有人知道我做错了什么吗?

【问题讨论】:

    标签: java wix windows-installer


    【解决方案1】:

    有几个问题我想总结一下:

    1. VBA 和 VBScript 函数:VBScript 看起来实际上是 VBA,在 MSI 中调用 VBScript 需要一些调整 正确调用 VBScript 函数。
    2. 重启:您安排的重启必须获得更好的条件以避免意外重启。
    3. 进程终止:你想终止什么进程?
      • Elevation:如果它被提升,你需要运行 kill 提升才能成功。您的每用户设置可能未设置为 完全提升(因此您通常只能结束以自己身份运行的进程)。
      • 重新启动管理器:由于 Windows 的重新启动管理器功能,您通常不需要终止进程,Windows 安装程序尝试使用。 Attempt to explain this feature(寻找 黄色部分)。

    问题 1那一定是 VBA 脚本而不是 VBScript? 记录一下:我没见过 return 在 VBScript 中?在 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:重新启动。在我看来,这是一个非常严重的问题。我见过有人因为在大规模部署期间导致意外重启而被赶出家门。在打开十几个 Visual Studio 窗口、几十个浏览器窗口以及 Word 和 Excel 的情况下重新启动知识工作者的 PC(和他们的经理),你可以命名它。它会导致很多问题。他们可能知道你住在哪里! :-)

    请阅读以下答案(至少开头有 3 个要点):Reboot on install, Don't reboot on uninstall


    问题 3:进程终止。如上所述,进程的终止与重新启动问题有关。如果进程与 Windows 重新启动管理器兼容,则并不总是需要终止进程,如上面的链接中所述。 Let me repeat it here(黄色部分应该给你它的要点——尤其是我认为的第二个)。

    有几种不同的方法可以杀死进程。请注意,最常见的问题可能是您没有终止进程的访问权限和/或特权 - 无论您使用什么工具或方法来执行此操作。

    也许您可以尝试 Util 架构中的 CloseApplication 功能http://wixtoolset.org/documentation/manual/v3/xsd/util/closeapplication.html

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

    【讨论】:

    • Thx 伙计,我不知道 vbs 和 vba 之间有什么区别,您的示例来自 killing a process.. 工作。另外,这个软件应该安装在特殊的设备上,没有人将其用作PC。而且,这个软件启动windows服务,所以不重启就无法工作。无论如何,你拯救了我的一天。
    • 请在 ScheduleReboot 操作上验证该条件(访问链接的答案 - 它表明条件更严格 - 可能不适合所有人)。根据我的经验,根据目标机器的意外重启会给你带来很多麻烦。只是一个提示。祝实施和测试顺利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2014-08-20
    • 1970-01-01
    相关资源
    最近更新 更多