如何在 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 让我走上正轨。
我想使用 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 让我走上正轨。