Ответ 1
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "Item1", ""
dic.Add "Item2", ""
dic.Add "Item3", ""
Я пытаюсь создать простой список в VBscript, но я не могу найти что-то подобное.
В принципе, я работаю над Active Directory, и мне нужно получить все группы, в которых пользователь является членом всех пользователей в домене. Теперь каждый пользователь может быть членом другого числа групп, поэтому я планирую использовать словарь, причем ключ является SAMID для пользователя, а значение представляет собой список всех групп, в которых он/она является членом.
Я могу сделать это со статическим массивом, но тогда я должен объявить случайный большой размер для массива, который не является хорошим. То, что я в идеале хотел бы сделать, это иметь список, подобный python, где я могу просто сделать что-то вроде myList.Add и не беспокоиться о размере.
Я попытался использовать System.Collection.ArrayList, но я получаю сообщение об ошибке при запуске:
PS C:\tmp> cscript.exe .\foo.vbs
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.
C:\tmp\foo.vbs(1, 1) (null): 0x80131700
как я могу это сделать?
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "Item1", ""
dic.Add "Item2", ""
dic.Add "Item3", ""
Избавьтесь от словаря и развяжите мощь ArrayList.
Option Explicit
dim list
Set list = CreateObject("System.Collections.ArrayList")
list.Add "Banana"
list.Add "Apple"
list.Add "Pear"
list.Sort
list.Reverse
wscript.echo list.Count ' --> 3
wscript.echo list.Item(0) ' --> Pear
wscript.echo list.IndexOf("Apple", 0) ' --> 2
wscript.echo join(list.ToArray(), ", ") ' --> Pear, Banana, Apple
EDIT: Я вижу, вы уже пробовали ArrayList, но получили сообщение об ошибке. Кажется, что ваша установка инфраструктуры dotnet неверна (System.Collections.ArrayList является частью этого). У Microsoft есть статья о том, как ее решить: http://answers.microsoft.com/en-us/windows/forum/windows_7-performance/error-code-0x80131700/3add8d80-00e0-4355-a994-8630d01c18f5
Вот альтернатива... Фактический класс List, который я создал некоторое время назад. Вы можете свободно использовать/модифицировать его в соответствии с вашими потребностями. Исходный класс, который я построил, фактически зависит от другого пользовательского класса ArrayIterator.
Вот как его использовать...
Set myList = New List
myList.Add("a")
myList.Add("b")
myList.Add("c")
' Iterate through the List using ArrayIterator. You can of course use other methods...
Set myListItr = myList.GetIterator
While myListItr.HasNext
MsgBox myListItr.GetNext
Wend
' Iterate through the List by getting the underlying Array.
Dim element
For Each element In myList.GetArray
MsgBox element
Next
Исходный код для класса Список:
Class List
Private mArray
Private Sub Class_Initialize()
mArray = Empty
End Sub
' Appends the specified element to the end of this list.
Public Sub Add(element)
If IsEmpty(mArray) Then
ReDim mArray(0)
mArray(0) = element
Else
If mArray(UBound(mArray)) <> Empty Then
ReDim Preserve mArray(UBound(mArray)+1)
End If
mArray(UBound(mArray)) = element
End If
End Sub
' Removes the element at the specified position in this list.
Public Sub Remove(index)
ReDim newArray(0)
For Each atom In mArray
If atom <> mArray(index) Then
If newArray(UBound(newArray)) <> Empty Then
ReDim Preserve newArray(UBound(newArray)+1)
End If
newArray(UBound(newArray)) = atom
End If
Next
mArray = newArray
End Sub
' Returns the number of elements in this list.
Public Function Size
Size = UBound(mArray)+1
End Function
' Returns the element at the specified position in this list.
Public Function GetItem(index)
GetItem = mArray(index)
End Function
' Removes all of the elements from this list.
Public Sub Clear
mArray = Empty
End Sub
' Returns true if this list contains elements.
Public Function HasElements
HasElements = Not IsEmpty(mArray)
End Function
Public Function GetIterator
Set iterator = New ArrayIterator
iterator.SetArray = mArray
GetIterator = iterator
End Function
Public Function GetArray
GetArray = mArray
End Function
End Class
Исходный код для класса ArrayIterator:
Class ArrayIterator
Private mArray
Private mCursor
Private Sub Class_Initialize()
mCursor = 0
End Sub
Public Property Let SetArray(array)
mArray = array
End Property
Public Function HasNext
HasNext = (mCursor < UBound(mArray)+1)
End Function
Public Function GetNext
GetNext = mArray(mCursor)
mCursor = mCursor + 1
End Function
End Class