2017-09-18 40 views
0

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

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

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

可以这样做吗?

enter image description here

+0

我对installscript并不熟悉,所以我没有添加它作为答案,但是......通常您可以[从命令行调用vbs](https://technet.microsoft.com/zh-cn/ -us/library/bb490816.aspx?f = 255&MSPPError = -2147217396)与'cscript.exe/path/to/your.vbs'我敢打赌,这将在屏幕印刷的第二个领域工作。 – JNevill

+0

@JNevill - 感谢您的想法 - 它让我在一个圆周的解决方案。事实证明,IS足够聪明,可以像我一样启动vbs脚本。由于IS UI中的特质,我没有正确指定“条件”。我仍然需要跳过其他一些环节才能获得我想要的行为,但至少我正走在正确的道路上。 –

+0

这是个好消息!如果您希望您可以在此添加解决方案作为答案并将其标记为此。这样,如果未来的其他人遇到同样的问题,这里会有一些帮助:) – JNevill

回答

0

事实证明,我的VBS脚本一起工作,不过我并没有在右部看我需要作出决定的关键注册表。在一个64位的盒子上,一个32位的进程查看Wow6432Node子项(神奇地重定向查看)。所以,如果我在寻找的关键

HKLM\Software\BoGusman

的过程实际上看着

HKLM\Software\Wow6432Node\BoGusman

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

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

0

调试VB脚本中的InstallShield是在颈部疼痛。旧学校调试,即写入日志文件是最好的,因为你将无法捕获错误信息等。

也可以通过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 

```

相关问题