正如标题所说。我需要检查VBS是否(1)Ghostscript安装在本地计算机上,如果安装(2)安装在哪里。
我认为问题(1)我已经解决了:
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Set oReg = GetObject("winmgmts:!root/default:StdRegProv")
If oReg.EnumKey(HKLM, "SOFTWARE\GPL Ghostscript\", arrSubKeys) = 0 Then
KeyExists = True
Else
KeyExists = False 'The script stops since it requires GS to be installed
End If
...
objShell.Run(pathToGhostScript & "-arguments")
但是,就我而言,注册表中的GS看起来像
HKEY_LOCAL_MACHINE\SOFTWARE\GPL Ghostscript\9.01\
注意:我正在检查注册表项SOFTWARE\GPL Ghostscript\
而不是SOFTWARE\GPL Ghostscript\9.01\
,因为如果有人安装了FALSE
或其他内容,我的检查会返回...\9.2\
。我假设可能安装的版本,注册表项SOFTWARE\GPL Ghostscript\
将始终存在。这个假设是否正确?
最终,我需要打电话(在我的情况下)C:\Program Files\gs\gs9.01\bin\gswin32.exe
。如果我查看注册表,..\bin\
的路径只能来自注册表值SOFTWARE\GPL Ghostscript\9.01\GS_DLL
,它返回C:\Program Files\gs\gs9.01\bin\gsdll32.dll
。我假设我可以使用此值,删除..\bin\
之后的所有内容并将gswin32.exe
连接到路径。然后我会在上面的脚本中填充pathToGhostScript
变量。
问题:如何从脚本中返回GS_DLL
的值?因为我知道在我的情况下可以在..\9.01\GS_DLL
下找到值,但在其他人的电脑上也可能是例如。 ..\9.57\GS_DLL
...
我的问题:
答案 0 :(得分:3)
我认为可以安全地假设Ghostscript可执行文件与DLL位于同一目录中,所以这样的东西应该可以工作:
Const HKLM = &h80000002
Const baseKey = "SOFTWARE\GPL Ghostscript"
Const value = "GS_DLL"
Set reg = GetObject("winmgmts://./root/default:StdRegProv")
If reg.EnumKey(HKLM, baseKey, subkeys) <> 0 Then
WScript.Echo "Cannot enumerate subkeys of " & baseKey & "."
WScript.Quit 1
End If
For Each sk In subkeys
If reg.GetStringValue(HKLM, baseKey & "\" & sk, value, gsLib) <> 0 Then
WScript.Echo "Cannot read value " & value & "."
WScript.Quit 1
End If
Next
Set fso = CreateObject("Scripting.FileSystemObject")
gsDir = fso.GetParentFolderName(gsLib)
gs = fso.BuildPath(gsDir, "gswin32.exe")
WScript.Echo gs