【问题标题】:Executing a script file from a Windows Installer Custom Action从 Windows Installer 自定义操作执行脚本文件
【发布时间】:2010-09-11 01:22:56
【问题描述】:

我需要在 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 文件)。没有报告错误(至少我可以说)。为什么此脚本不能作为“卸载自定义操作”的一部分工作

【问题讨论】:

  • 批处理文件的目的是什么,您是否尝试通过批处理文件删除 Windows 服务?如果是这样,有一些更简单的方法可以在您的服务项目中使用 Installer 类来执行此操作。让我知道,我会发布我一直使用的代码。

标签: visual-studio-2008 vbscript windows-installer


【解决方案1】:

我遇到了同样的问题,问题是您无法在 vbs 文件中调用 WScript - 您只需调用 CreateObject

即。

Set WshShell = CreateObject( "WScript.Shell" )
command = "uninstall-windows-serivce.bat"
msgbox command
WshShell.Run ("cmd /C " & """" & command & """")
Set WshShell = Nothing

【讨论】:

  • 原因是,正如我昨天发现的那样,您的 vbs 文件不是托管在 Windows 脚本主机中,而是由 MSI 本身托管。因此,WMI API 不可用。没有“WScript”。虽然看起来 WScript 是可访问的(即“WScript.Shell”),但这只是一个名称空间,而不是对象“WScript”。
  • WScript.Shell 是一个 COM 对象。它与通过 WSH 运行脚本时可用的 WScript 对象不同。
【解决方案2】:

您需要分发应用程序的范围越广,我就越强烈建议您反对脚本化自定义操作。以前写过一堆,但是发现太多电脑运行VBScript或者JavaScript都有问题。我最终用 C++ 重写了它们来处理这种情况。这里有几篇文章深入解释了为什么应该避免脚本化的自定义操作:

【讨论】:

    【解决方案3】:

    在您的安装程序类中,您是否覆盖了 Uninstall 方法:

     Public Overrides Sub Uninstall(ByVal savedState As System.Collections.IDictionary)
                MyBase.Uninstall(savedState)
               'Shell to batch file here
        End Sub
    

    其次,您是否限定了批处理文件的完整路径?

    【讨论】:

      【解决方案4】:

      您是否检查过批处理文件是否位于脚本所看到的当前目录中?我将添加另一条消息,显示它正在使用的目录,以确保它实际上正在尝试执行您认为它所在的批处理文件。

      【讨论】:

        【解决方案5】:

        Windows 安装程序脚本通常作为系统运行,除非您另有说明。您的批处理文件是否可能需要由交互式用户运行?

        【讨论】:

          【解决方案6】:

          对我有用的是指定 .bat 文件的完整路径。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-08-26
            • 2021-10-05
            • 1970-01-01
            • 1970-01-01
            • 2011-11-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多