请您阅读此代码并告诉我错在哪里?
为了快速浏览,我正在为IE主页的辅助开始页面读取HKCU MultiStringValue,并将我自己作为列表中的第一项强制执行,同时将用户的预设保留为其余值。
当我有我的网址和用户的预设全部合并后,脚本运行正常,但如果我只设置了我的,allURLs
会抛出错误
下标超出范围
即使我将强制执行的网址放入allURLs(0)
,所以它不是空的并且在顶部正确初始化。
Option Explicit
Dim ObjName, oADSysInfo, strComputer
Dim objReg, IE_Main, mstrValName, strFunctionIntranet, strNYHomepage, _
multiStringValues(), allURLs(), itemname, a, return
Set oADSysInfo = CreateObject("ADSystemInfo")
Set ObjName = GetObject("LDAP://" & oADSysInfo.UserName)
strComputer = "."
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
Const HKCU = &H80000001
IE_Main = "Software\Microsoft\Internet Explorer\Main"
mstrValName = "Secondary Start Pages"
strNYHomepage = "http://www.google.com"
strFunctionIntranet = "www.mycompany.com"
SetHomePage
Sub SetHomepage
objReg.setStringValue HKCU, IE_Main, "Start Page", strNYHomepage
'Reading MultiStringValue of "Secondary Start Pages" for HKCU
'and continuing if it has something preset.
return = objReg.getMultiStringValue(HKCU, IE_Main, mstrValName, multiStringValues)
If return = 0 Then
a = 0
'Reading all items currently set to make sure users retain
'their existing URLs.
For Each itemname In multiStringValues
'Only continue if any of the existing URLs DO NOT MATCH
'what we are enforcing as the URL.
If itemname <> strFunctionIntranet Then
WScript.Echo itemname
WScript.Echo "itemname is NOT equal intranet"
a = a + 1
ReDim Preserve allURLs(a)
allURLs(a) = itemname
'a = a + 1
End If
Next
objReg.DeleteValue HKCU,IE_Main,mstrValName
'Enforce our URL to always be the first item.
allURLs(0) = strFunctionIntranet '<<< This is the ERROR
'Set the new MultiStringValue registry key back.
objReg.setMultiStringValue HKCU, IE_Main, mstrValName, allURLs
WScript.echo "finished setting all secondary tabs... "
Else
strFunctionIntranet = Array(strFunctionIntranet)
objReg.setMultiStringValue HKCU, IE_Main, mstrValName, strFunctionIntranet
End If
End Sub
Wscript.Quit
答案 0 :(得分:1)
我怀疑GetMultiStringValues
调用成功,但返回空结果。因此,跳过For Each
循环,直接进入语句
allURLs(0) = strFunctionIntranet
但是,allURLs
的定义如下:
Dim allURLs()
创建了Variant()
类型的变量,但没有实际大小,因此除非先ReDim
,否则无法使用它。 Never declare arrays that way。 始终定义具有适当大小的数组,例如:
ReDim allURLs(0)
它定义了一个大小为1的数组(即一个可以容纳一个元素的数组),因为你希望该列表中至少有一个URL。
如果您需要向数组添加更多元素,请按以下方式调整大小:
ReDim Preserve allURLs(UBound(allURLs)+1)
所以你可以在新的最后一个插槽中添加下一个元素,如下所示:
allURLs(UBound(allURLs)) = newvalue
这样你也不需要一个单独的计数器来跟踪数组大小。
另外,如果你想要预先填充一个数组,那么首先要做,而不是在你把其他所有东西放进去之后。
ReDim allURLs(0)
...
Sub SetHomepage
objReg.setStringValue HKCU, IE_Main, "Start Page", strNYHomepage
return = objReg.getMultiStringValue(...)
If return = 0 Then
allURLs(0) = strFunctionIntranet
For Each itemname In multiStringValues
If itemname <> strFunctionIntranet Then
'grow array by 1 and append itemname
ReDim Preserve allURLs(UBound(allURLs)+1)
allURLs(UBound(allURLs)) = itemname
End If
Next
objReg.DeleteValue HKCU, IE_Main, mstrValName
...
Else
...
End If
End Sub