web-dev-qa-db-fra.com

Listes dans VBScript

J'essaie de créer une liste simple dans un VBscript, mais je ne trouve pas quelque chose de similaire.

Fondamentalement, je travaille sur Active Directory et j'ai besoin d'obtenir tous les groupes dont un utilisateur est membre pour tous les utilisateurs d'un domaine. Maintenant, chaque utilisateur peut être membre d'un nombre différent de groupes, je prévois donc d'utiliser un dictionnaire, la clé étant le SAMID de l'utilisateur et la valeur étant une liste de tous les groupes dont il est membre. .

Je peux le faire avec un tableau statique, mais je dois ensuite déclarer une grande taille aléatoire pour le tableau qui n'est pas agréable. Idéalement, ce que j'aimerais faire, c'est avoir une liste de type python, où je peux simplement faire quelque chose comme myList.Add et ne pas avoir à me soucier du dimensionnement.

J'ai essayé d'utiliser System.Collection.ArrayList, mais j'obtiens une erreur lorsque je l'exécute:

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

comment puis-je accomplir cela?

16
NullPointer
Set dic = CreateObject("Scripting.Dictionary")

dic.Add "Item1", ""
dic.Add "Item2", ""
dic.Add "Item3", ""
9
ChiYoung

Débarrassez-vous du dictionnaire et libérez la puissance d'une 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: Je vois que vous avez déjà essayé ArrayList, mais vous avez obtenu une erreur. Il semble que votre installation du framework dotnet ne soit pas correcte (System.Collections.ArrayList en fait partie). Microsoft a un article sur la façon de résoudre ce problème: http://answers.Microsoft.com/en-us/windows/forum/windows_7-performance/error-code-0x80131700/3add8d80-00e0-4355-a994- 8630d01c18f5

52
AutomatedChaos

Voici également une alternative ... Une véritable classe List que j'ai créée il y a quelque temps. Vous pouvez librement l'utiliser/le modifier selon vos besoins. La classe d'origine que j'ai construite dépend en fait d'une autre classe personnalisée appelée ArrayIterator.

Voici comment l'utiliser ...

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

Code source de la classe List:

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

Code source pour ArrayIterator classe:

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
6
Alex Fu