VBScript MID 函数 - 无效的过程调用或参数 - 代码 800A0005

VBScript MID 函数 - 无效的过程调用或参数 - 代码 800A0005

我创建了一个 VBScript,用于更改服务器上的文件夹共享名称。它目前作为我的测试用户的登录脚本运行。

我已经定义了这个函数:

Private Function intChangeShareName()
   Dim intPoz1, intPoz2, intIndex
   Dim strPom

   intChangeShareName = CONST_NO_CHANGE

   strActions = strActions & strOldNameShare & vbcrlf
  strPom = Trim(strOldNameShare)
  If Left(strPom, 2) <> "\\" then Exit Function

   intPoz1 = inStr(3, strPom, "\")
   intPoz2 = inStr(3, strPom, ".")
   If intPoz2 > 0 Then
      strSrvName = Mid(strPom, 3, intPoz2 - 3)
      strDomName = Mid(strPom, intPoz2 + 1, intPoz1 - intPoz2 - 1)
   Else
     strSrvName = Mid(strPom, 3, intPoz1 - 3)
      strDomName = ""
   End If

   intIndex = 0
  Do while intIndex <= UBound(arrOldSrv)
     If UCase(strSrvName) = UCase(arrOldSrv(intIndex)) Then
        If strDomName = "" Then
           strNewNameSrv = arrNewSrv(intIndex)
           strNewNameDom = ""
        intChangeShareName = CONST_CHANGE
         End If

        If UCase(strDomName) = UCase(arrOldDom(intIndex)) Then
           strNewNameSrv = arrNewSrv(intIndex)
           strNewNameDom = "." & arrNewDom(intIndex)
        intChangeShareName = CONST_CHANGE
         End If
      End If
      intIndex = intIndex + 1
   Loop

   If intChangeShareName = CONST_CHANGE Then
      strNewNameShare = "\\" & strNewNameSrv & strNewNameDom & Mid(strPom, intPoz1)
      strActions = strActions & "*  " & strNewNameShare & vbcrlf
      blRequireLogoff = True
'       Wscript.Echo "a " & strNewNameShare
   End If

End Function

但是每次我登录时都会出现以下错误:VBScript 运行时错误 - 无效的过程调用或参数:“Mid” - 代码 800A0005

我没有发现我的 Mid 函数有什么问题,有人可以帮帮我吗?

答案1

所有出现的MID功能在您的代码中正确遵循语法模式Mid(string, start[, length])

参数

  • string返回字符的字符串表达式。如果字符串包含NullNull则返回。
  • start字符串中要提取的部分的开始字符位置。如果 start 大于字符串中的字符数,则 Mid 返回零长度字符串 ( "")。
  • length返回的字符数。如果省略或文本中的字符数少于 length(包括 start 处的字符),则start返回从该位置到字符串末尾的所有字符。

摘自原始代码片段,变量重命名仅仅是为了清晰起见:

iPosBackSlash = inStr(3, strPom, "\")
iPosDot       = inStr(3, strPom, ".")
If iPosDot > 0 Then
   strSrvName = Mid(strPom,           3, iPosDot - 3)
   strDomName = Mid(strPom, iPosDot + 1, iPosBackSlash - iPosDot - 1)
Else
   strSrvName = Mid(strPom,           3, iPosBackSlash - 3)
   strDomName = ""
End If
''' and thereinafter '''
strNewNameShare = "\\" & strNewNameSrv & strNewNameDom & Mid(strPom, iPosBackSlash)

另一方面,如果或超出范围,MID函数将失败并引发终止错误。Invalid procedure call or argument: 'Mid' - Code 800A0005startlength

让我们考虑一些有效的北卡罗来纳大学路径作为strPom变量的可能值:

  • \\server\root,,,\\server\root\sub:原始\\server.domain\root函数\\server.domain\root\sub不会失败,
  • 但例如\\server\root\sub.folder引发指定问题中的错误length,即iPosBackSlash - iPosDot - 1结果为负数。

If (iPosDot > 0) and (iPosDot < iPosBackSlash) Then 应该解决后者的问题尽管有人可以找到一个有效的北卡罗来纳大学路径是否这样iPosDot - 3或者iPosBackSlash - 3会导致错误?

回答,返回原始变量名,使用 next改进 If命令:

If intPoz2 > 0 and (intPoz2 < intPoz1) Then
    ''' etc '''

相关内容