如何在 InstallScript 项目中调用 VBScript

How to call VBScript in InstallScript project

我想使用 VB Script 脚本文件作为 InstallScript 项目先决条件的目标。我需要使用 VB 脚本,因为我必须检查几个不同的条件,这些条件在 IS 先决条件编辑器中使用常规条件是不可能的(即,操作系统条件是 OR,其他条件是 AND。)

我看过 link here 但它不适用于 InstallScript 项目。

我也试过简单地在 "Specify the application you wish to launch" 组合中命名,但这似乎不起作用。 (.vbs 脚本只显示一个模态对话框,以便我可以测试基本功能。)

这能做到吗?

在 InstallShield 中调试 VBScript 是一件令人头疼的事情。老派调试,即写入日志文件,是最好的,因为您将无法捕获错误消息等。

也可以通过 winmgmts 从 InstallShield 读取和写入注册表,但这很麻烦。这是一个演示这一点的例子。由于我们的应用程序使用 32 位注册表项,并且我们不知道它是由 32 位还是 64 位处理的 Windows,我们必须检查 32 位注册表项的两个位置(即 Wow6432Node)。

这是我们用来读取注册表的一些代码:

Option Explicit

Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002

Dim SoftVersion
SoftVersion = RegReadString("HKLM\SOFTWARE\Co\Software\Version")
If SoftVersion = "" Then
  SoftVersion = RegReadString("HKLM\SOFTWARE\Wow6432Node\Co\Software\Version")
End If

Function RegReadString(path)
  ' RegRead = CreateObject("WScript.Shell").RegRead(path)
  Dim objReg, hkroot, pos, posNext, keyPath, valueName, value
  Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\default:StdRegProv")
  hkroot = HKEY_CURRENT_USER
  If Left(path, 5) = "HKCU\" Then
    hkroot = HKEY_CURRENT_USER
    path = Mid(path, 6)
  ElseIf Left(path, 5) = "HKLM\" Then
    hkroot = HKEY_LOCAL_MACHINE
    path = Mid(path, 6)
  End If
  pos = InStr(path, "\")
  posNext = InStr(pos + 1, path, "\")
  While posNext > 0
    pos = posNext
    posNext = InStr(pos + 1, path, "\")
  Wend
  keyPath = Left(path, pos - 1)
  valueName = Mid(path, pos + 1)
  objReg.GetStringValue hkroot, keyPath, valueName, value
  If IsNull(value) Then
    RegReadString = ""
  Else
    RegReadString = value
  End If
End Function

Sub RegWriteString(path, value)
  Dim objReg, hkroot, pos, posNext, keyPath, valueName
  Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\default:StdRegProv")
  hkroot = HKEY_CURRENT_USER
  If Left(path, 5) = "HKCU\" Then
    hkroot = HKEY_CURRENT_USER
    path = Mid(path, 6)
  ElseIf Left(path, 5) = "HKLM\" Then
    hkroot = HKEY_LOCAL_MACHINE
    path = Mid(path, 6)
  End If
  pos = InStr(path, "\")
  posNext = InStr(pos + 1, path, "\")
  While posNext > 0
    pos = posNext
    posNext = InStr(pos + 1, path, "\")
  Wend
  keyPath = Left(path, pos - 1)
  valueName = Mid(path, pos + 1)
  objReg.SetStringValue hkroot, keyPath, valueName, value
End Sub

```

原来我的 VBS 脚本一直在工作,但我没有在注册表的正确部分寻找我需要做出决定的密钥。在 64 位机器上,32 位进程查看(神奇地重定向到查看)Wow6432Node 子项。所以如果我正在寻找钥匙

HKLM\Software\BoGusman

这个过程实际上正在看

HKLM\Software\Wow6432Node\BoGusman

目标密钥存在于 64 位注册表中,但不存在于 Wow6432Node 中。在这两个位置创建密钥解决了问题。

感谢@JNevill 和@Steven Quan 让我走上正轨。