如何在InstallScript项目

时间:2017-09-18 14:26:26

标签: vbscript installscript

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

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

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

可以这样做吗?

enter image description here

2 个答案:

答案 0 :(得分:0)

调试InstallShield中的VBScripts是一件痛苦的事。旧学校调试,即写入日志文件,是最好的,因为,您无法捕获错误消息等。

从InstallShield读取和写入注册表也可以通过winmgmts完成,但这很痛苦。这是一个证明这一点的例子。由于我们的应用程序使用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

```

答案 1 :(得分:0)

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

HKLM\Software\BoGusman

该过程实际正在查看

HKLM\Software\Wow6432Node\BoGusman

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

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