2012-11-27 6 views
11

Próbuję utworzyć prostą listę w VBscript, ale nie mogę znaleźć czegoś podobnego.Listy w VBScript

Zasadniczo pracuję nad katalogiem aktywnym i muszę uzyskać wszystkie grupy, których użytkownik jest członkiem dla wszystkich użytkowników w domenie. Teraz każdy użytkownik może być członkiem innej liczby grup, więc planuję użyć słownika, którego kluczem jest SAMID dla użytkownika, a wartość jest listą wszystkich grup, do których jest członkiem. .

Mogę to zrobić za pomocą statycznej tablicy, ale wtedy muszę zadeklarować losowy duży rozmiar tablicy, która nie jest miła. Co chciałbym zrobić najlepiej, to mieć listę podobną do Pythona, w której mogę zrobić coś podobnego do myList.Add i nie muszę się martwić o wielkość.

Próbowałem za pomocą System.Collection.ArrayList, ale pojawia się błąd, gdy uruchomię go:

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 

w jaki sposób można to osiągnąć?

Odpowiedz

9
Set dic = CreateObject("Scripting.Dictionary") 

dic.Add "Item1", "" 
dic.Add "Item2", "" 
dic.Add "Item3", "" 
+0

Prawy , więc po prostu użyj słownika jako listy ... hmm, nie najczystsze, ale myślę, że to zrobi. Pozdrowienia – NullPointer

40

Pozbądź słownika i wykorzystać moc 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: Widzę, że już próbował ArrayList, ale wystąpił błąd. Wygląda na to, że twoja instalacja frameworka dotnet nie jest poprawna (System.Collections.ArrayList jest tego częścią). Microsoft ma artykuł o tym, jak to rozwiązać: http://answers.microsoft.com/en-us/windows/forum/windows_7-performance/error-code-0x80131700/3add8d80-00e0-4355-a994-8630d01c18f5

+0

Dzięki, moim pierwszym instynktem było użycie ArrayList, ale rozwiązałem problem na razie używając Słownika. Spojrzę na link MS, okrzyki :) – NullPointer

+0

Próbuję uzyskać dostęp do elementów listy za pomocą '.Item (0)', ale otrzymuję komunikat 'Missing Default Property'. Potwierdziłem, że są co najmniej 2 obiekty na liście arraylist przy użyciu '.Count'. Są także obiektami, a nie rodzimymi, jeśli to ma znaczenie. – crush

+0

Nie można "echo" obiektu, który nie ma właściwości domyślnej lub właściwości domyślnej, która nie zwraca prymitywu. Jeśli wiesz, jaki to jest obiekt, możesz wyświetlić jego odpowiednią właściwość, taką jak 'Nazwa' lub uzyskać informację, jeśli ma ona metodę' ToString() '. Alternatywnie można uzyskać jego nazwę za pomocą 'wscript.echo nazwa-pliku (list.Item (i))'. – AutomatedChaos

4

Oto alternatywa ... Właściwa klasa listy, którą stworzyłem jakiś czas temu. Możesz dowolnie go używać/modyfikować zgodnie ze swoimi potrzebami. Oryginalna klasa, którą zbudowałem, zależy od innej niestandardowej klasy o nazwie ArrayIterator.

Oto jak go używać ...

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 

Kod źródłowy Lista klasa:

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 

Kod źródłowy ArrayIterator klasa:

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 
+0

Dzięki Alex, wygląda jak tablica, która jest dynamicznie przeskalowane każdym element dodaje całkiem dobry obejście do listy – NullPointer

+1

Zachowanie swojej funkcji Usuń jest nietypowy. Szuka podanego indeksu jako parametru. Następnie usuwa wszystkie wystąpienia wartości znalezionej na tej pozycji. To znaczy. załóż te dane (a, B, c, d, e, B, f). Usuń (1) zwróci (a, c, d, e, f). Jako dodatkowy bonus metoda zawiera błąd: Rozmiar zwraca 7, a nie 5. – mgr326639