2011-07-31 51 views
0

我在試着瞭解我要在哪裏出錯。以下腳本將始終在數組末尾返回一個空項目。爲什麼?我不認爲這是記錄集的問題。有任何想法嗎?連接和分割返回ubound(array)+ 1項

function allServers 
    Set adoCommand = CreateObject("ADODB.Command") 
    Set adoConnection = CreateObject("ADODB.Connection") 
    adoConnection.Provider = "ADsDSOObject" 
    adoConnection.Open "Active Directory Provider" 
    Set adoCommand.ActiveConnection = adoConnection 

    Set objRootDSE = GetObject("LDAP://RootDSE") 

    strDNSDomain = objRootDSE.Get("defaultNamingContext") 
    strBase = "<LDAP://" & strDNSDomain & ">" 
    strFilter = "(&(objectCategory=computer)(operatingsystem=*server*)(!userAccountControl:1.2.840.113556.1.4.803:=2))" 
    strAttributes = "name,distinguishedname,dnshostname" 
    strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree" 
    adoCommand.CommandText = strQuery 
    adoCommand.Properties("Page Size") = 100 
    adoCommand.Properties("Timeout") = 30 
    adoCommand.Properties("Cache Results") = False 

    Set adoRecordset = adoCommand.Execute 
    dim strList, i 
    Do Until adoRecordset.EOF 
     strList = strList & adoRecordSet.Fields("name").Value & "," 
    adoRecordset.MoveNext 
    loop 
    adoRecordset.Close 
    adoConnection.Close 

    arr = split(strList, ",",-1,1) 
    allServers = arr 
end function 

arr = allservers 
For i = 0 to UBound(arr) 
    wscript.echo i & ":" & arr(i) 
next 

回答

0

您的循環:

Do Until adoRecordset.EOF 
    strList = strList & adoRecordSet.Fields("name").Value & "," 
    adoRecordset.MoveNext 
loop 

把最後一個/後/終端 「」 在strList結束。 Split()將「,」視爲分隔符(不是終結符),因此生成的數組有一個虛假的最後一個空元素。

爲了避免這種情況,您可以在循環中連接"," & value,並使用Mid()對z進行前面的「,」。但爲什麼不使用「SELECT COUNT」或Recordset.Count來在循環之前對數組進行維度定位並將值分配給其元素,或者 - 甚至更好 - Recordset.GetRows()直接獲取(儘管是2個dim)數組 - >沒有concat,沒有分裂,沒有問題。

+0

感謝您的回答。我選擇在循環中分配值。它看起來像 Active Directory提供程序不支持.Count。 – yajohn