使用vbscript设置注册表multiStringValue时出现无效参数错误

时间:2016-05-06 22:49:02

标签: vbscript

这是参考我前面提到的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

1 个答案:

答案 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已经变得毫无意义,那么