【问题标题】:How to call VBScript in InstallScript project如何在 InstallScript 项目中调用 VBScript
【发布时间】:2017-09-18 14:26:25
【问题描述】:

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

我已经看到链接 here,但它不适用于 InstallScript 项目。

我也尝试在“指定要启动的应用程序”组合中简单地命名,但这似乎不起作用。 (.vbs 脚本只是显示一个模式对话框,以便我可以测试基本功能。)

这可以吗?

【问题讨论】:

  • 我不熟悉 installscript,所以我没有添加这个作为答案,但是......通常你可以 call a vbs from the command linecscript.exe /path/to/your.vbs 我打赌那会起作用屏幕打印中的第二个字段。
  • @JNevill - 感谢您的想法 - 它让我以一种全面的方式找到了解决方案。事实证明,IS 足够聪明,可以像我一样启动 vbs 脚本。由于 IS UI 的特性,我没有正确指定“条件”。我仍然需要跳过其他一些环节才能获得我想要的行为,但至少我走在正确的道路上。
  • 这是个好消息!如果您愿意,可以在此处添加您的解决方案作为答案并将其标记为此类。这样,如果将来其他人遇到同样的问题,那么这里会有一些帮助:)
  • 好吧,我很乐意添加我的解决方案作为答案,但我无法成功地将这个概念付诸实施。 InstallScript(实际上,它是一个 InstallShield InststallScript 项目)是我用过的最令人沮丧的工具。它根本没有与 MS 生态系统的其他部分一起成长。我可以从命令行让我的 vbs 正常工作,但从 IS 先决条件内部,它不能正常工作,我不知道为什么。最终,我要做的就是寻找一个注册表项,这显然是不允许的。 :(

标签: vbscript installscript


【解决方案1】:

在 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

```

【讨论】:

    【解决方案2】:

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

    HKLM\Software\BoGusman

    过程是其实在看

    HKLM\Software\Wow6432Node\BoGusman

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多