这是参考我前面提到的existing question但是在做另一个子时同样的条件不起作用。下面的所有变量都是正确的,也是字符串。在此行上设置值时出现错误:
objReg.setMultiStringValue HKCU,IE_Main,mStrSecStartPages,allURLs
代码如下;
return = objReg.getMultiStringValue (HKCU,IE_Main,mStrSecStartPages,multiStringValues)
'If values found in Secondary Start Pages
If return=0 Then
ReDim allURLs(0)
'Read all values and only store non intranet values to array
For Each itemname In multiStringValues
If itemname <> strFunctionIntranet1 And itemname <> strFunctionIntranet2 And itemname <> strFunctionIntranet3 And itemname <> strFunctionIntranet4 Then
ReDim Preserve allURLs(UBound(allURLs)+1)
allURLs(UBound(allURLs)) = itemname
End If
Next
'Remove current key holding existing values
objReg.DeleteValue HKCU,IE_Main,mStrSecStartPages
'Set new values based on values read and user's intranet
if UBound(allURLs)>=0 Then
wscript.echo "in setting"
objReg.setMultiStringValue HKCU,IE_Main,mStrSecStartPages,allURLs
End If
wscript.echo "out setting"
End If
答案 0 :(得分:0)
问题是即使REG_MULTI_SZ值中没有任何值,您仍然会返回一个空数组,这意味着当您循环遍历数组并使用
动态展开它时ReDim Preserve allURLs(UBound(allURLs)+1)
数组中的第一个位置始终有一个空白元素,当传递给
时objReg.setMultiStringValue HKCU,IE_Main,mStrSecStartPages,allURLs
如果它不是你将获得的唯一元素
SWbemObjectEx:参数无效
以下是我为证明这一点所做的一些测试
Option Explicit
Const HKEY_LOCAL_MACHINE = &H80000002
Dim oReg
Dim strKeyPath, strValueName, arrStringValues
Dim strComputer: strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Microsoft\Internet Explorer\Main"
strValueName = "Default_Secondary_Page_URL"
Dim rtn
rtn = oReg.GetMultiStringValue(HKEY_LOCAL_MACHINE, strKeyPath, strValueName, arrStringValues)
Dim i
If rtn = 0 Then
If IsArray(arrStringValues) Then
For i = 0 To UBound(arrStringValues)
WScript.Echo "arrStringValues(" & i & ") = " & arrStringValues(i)
Next
Else
WScript.Echo "Not Array"
End If
Else
WScript.Echo "Failed to GetMultiStringValue - Return (" & rtn & ")"
End If
rtn = oReg.SetMultiStringValue(HKEY_LOCAL_MACHINE,strKeyPath,strValueName,arrStringValues)
WScript.Echo "SetMultiStringValue - Return (" & rtn & ")"
输出:
arrStringValues(0) =
SetMultiStringValue - Return (0)
添加以下行以在IsArray()
检查
ReDim Preserve arrStringValues(UBound(arrStringValues) + 1)
输出:
arrStringValues(0) =
arrStringValues(1) =
test36.vbs(31, 1) SWbemObjectEx: Invalid parameter
所以SetMultiSringValue()
将接受一个包含空元素的数组,如果它是数组中唯一的元素,那么当你尝试添加更多元素时,你将得到如上所述的错误。
要在开头停止创建额外的空白元素,您可以切换到使用For
而不是For Each
,这样您就可以告诉循环只调用
ReDim Preserve allURLs(UBound(allURLs)+1)
当Array的索引大于0
时For i = 0 To UBound(multiStringValues)
itemname = multiStringValues(i)
If itemname <> strFunctionIntranet1 And itemname <> strFunctionIntranet2 And itemname <> strFunctionIntranet3 And itemname <> strFunctionIntranet4 Then
'Only expand if we have more then 1 value in multiStringValues
If i > 0 Then ReDim Preserve allURLs(UBound(allURLs)+1)
allURLs(UBound(allURLs)) = itemname
End If
Next
您当然可以使用For Each
来执行此操作,但是您必须使用另一个变量手动跟踪数组索引,在我看来,如果For
已经变得毫无意义,那么