Конкатенация и разбиение возвращают ubound (массив) + 1 элементов - PullRequest
0 голосов
/ 31 июля 2011

Я пытаюсь понять, где я иду не так здесь.Следующий скрипт всегда будет возвращать пустой элемент в массиве в конце.Зачем?Я не думаю, что это проблема с набором записей.Есть идеи?

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

1 Ответ

0 голосов
/ 31 июля 2011

Ваш цикл:

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

помещает последний / завершающий / завершающий "," в конец strList.Split () обрабатывает "," как разделитель (не терминатор), поэтому результирующий массив имеет ложный последний пустой элемент.

Чтобы избежать этого, вы можете объединить "," & value в цикле и убрать предыдущий ", используя Mid ().Но почему бы не использовать «SELECT COUNT» или Recordset.Count для измерения массива перед циклом и присвоения значений его элементам, или - что еще лучше - Recordset.GetRows () для прямого получения (хотя и 2 тусклого) массива ->без конкатов, без сплитов, без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...