Group-Policy

VBScript MID 函式 - 無效的過程呼叫或參數 - 程式碼 800A0005

  • January 3, 2017

我創建了一個 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 功能有什麼問題,有人可以幫我嗎?

程式碼中所有出現的MID函式都正確遵循語法模式Mid(string, start[, length])

論據

  • string從中返回字元的字元串表達式。如果字元串包含NullNull則返回。
  • start字元串中要提取的部分開始的字元位置。如果 start 大於 string 中的字元數,則 Mid 返回零長度字元串 ( "")。
  • length要返回的字元數。如果省略或文本中的字元少於長度(包括開頭的字元),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 800A0005``start``length

讓我們考慮一些有效的UNC路徑作為strPom變數的可能值:

  • \\server\root, \\server\root\sub, \\server.domain\root, \\server.domain\root\sub: 原函式不會失敗,
  • 但例如\\server\root\sub.folder會引髮指定的錯誤,lengthiPosBackSlash - iPosDot - 1結果為負數。

If (iPosDot > 0) and (iPosDot < iPosBackSlash) Then **應該解決後一個問題,**儘管有人可以找到有效的UNC路徑,這樣iPosDot - 3iPosBackSlash - 3會導致錯誤?

答案,返回原始變數名,使用下一個改進的 If命令:

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

引用自:https://serverfault.com/questions/818094