2012-11-27 15 views
11

में सूचीबद्ध है मैं एक वीबीस्क्रिप्ट में एक साधारण सूची बनाने की कोशिश कर रहा हूं, लेकिन मैं कुछ ऐसा नहीं ढूंढ पा रहा हूं।वीबीस्क्रिप्ट

असल में, मैं सक्रिय निर्देशिका पर काम कर रहा हूं, और मुझे सभी समूहों को एक डोमेन के भीतर सभी उपयोगकर्ताओं के लिए सदस्य होने की आवश्यकता है। अब, प्रत्येक उपयोगकर्ता समूह की एक अलग संख्या का सदस्य हो सकता है, इसलिए मैं उपयोगकर्ता के लिए सैमड की कुंजी के साथ एक शब्दकोश का उपयोग करने की योजना बना रहा हूं, और मूल्य उन सभी समूहों की सूची है, जिनके सदस्य हैं ।

मैं इसे एक स्थिर सरणी के साथ कर सकता हूं, लेकिन फिर मुझे उस सरणी के लिए एक यादृच्छिक बड़ा आकार घोषित करना है जो अच्छा नहीं है। मैं आदर्श रूप से क्या करना चाहूंगा जिसमें एक पाइथन जैसी सूची है, जहां मैं अपनी सूची जैसे कुछ सरल कर सकता हूं। जोड़ें और आकार बदलने के बारे में चिंता करने की ज़रूरत नहीं है।

मैं 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 

मैं यह कैसे पूरा कर सकते हैं?

उत्तर

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

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

अधिकार , इसलिए मूल रूप से एक सूची के रूप में एक शब्दकोश का उपयोग करें ... हम्म, सबसे साफ नहीं लेकिन मुझे लगता है कि यह करेगा। चीयर्स – NullPointer

40

शब्दकोश से छुटकारा पाएं और एक 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 

संपादित करें: मैं देख रहा हूँ आप पहले से ही ArrayList कोशिश की, लेकिन एक त्रुटि मिली। ऐसा लगता है कि डॉटनेट ढांचे की आपकी स्थापना सही नहीं है (System.Collections.ArrayList उस का हिस्सा है)। माइक्रोसॉफ्ट के पास यह हल करने के बारे में एक लेख है: http://answers.microsoft.com/en-us/windows/forum/windows_7-performance/error-code-0x80131700/3add8d80-00e0-4355-a994-8630d01c18f5

+0

धन्यवाद, मेरी पहली प्रवृत्ति ArrayList का उपयोग करना था, लेकिन मैंने अब शब्दकोश का उपयोग करने के लिए समस्या हल कर दी है। मैं एमएस लिंक देखता हूं, चीयर्स :) – NullPointer

+0

मैं 'आइटम (0)' के साथ सूची आइटम तक पहुंचने का प्रयास कर रहा हूं लेकिन मुझे 'गुमशुदा डिफ़ॉल्ट संपत्ति' त्रुटि मिल रही है। मैंने पुष्टि की है कि '.Count' का उपयोग करके सरणी सूची में कम से कम 2 ऑब्जेक्ट्स हैं। वे वस्तुएं हैं, न कि देशी प्रकार, यदि यह मायने रखती है। – crush

+0

आप उस ऑब्जेक्ट को 'echo' नहीं कर सकते हैं जिसमें डिफ़ॉल्ट संपत्ति या डिफ़ॉल्ट प्रॉपर्टी नहीं है जो एक आदिम वापस नहीं लौटाती है। यदि आप जानते हैं कि यह किस प्रकार की वस्तु है, तो आप 'उपयुक्त' जैसी उचित संपत्ति प्रदर्शित कर सकते हैं या जानकारी प्राप्त कर सकते हैं यदि उसके पास 'ToString()' विधि है। वैकल्पिक रूप से, आप इसका नाम 'wscript.echo typename (list.Item (i)) 'के साथ प्राप्त कर सकते हैं। – AutomatedChaos

4

यहां एक विकल्प भी है ... एक वास्तविक सूची वर्ग जिसे मैंने कुछ समय पहले बनाया था। आप अपनी जरूरतों के अनुसार स्वतंत्र रूप से इसका उपयोग/संशोधित कर सकते हैं। मैंने बनाया मूल वर्ग वास्तव में ArrayIterator नामक एक और कस्टम क्लास पर निर्भर करता है।

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 वर्ग:

इसका इस्तेमाल करने के लिए ...

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

धन्यवाद एलेक्स, एक सरणी की तरह दिखता है जो प्रत्येक आइटम को गतिशील रूप से आकार में बदलता है, एक सूची के लिए बहुत अच्छा कामकाज – NullPointer

+1

आपके निकालें फ़ंक्शन का व्यवहार अटूट है। यह पैरामीटर के रूप में प्रदान की गई इंडेक्स की खोज करता है। फिर यह उस स्थिति में पाए गए मान की सभी घटनाओं को हटा देता है। अर्थात। इस डेटा को मानें (ए, बी, सी, डी, ई, बी, एफ)। निकालें (1) वापस आ जाएगा (ए, सी, डी, ई, एफ)। एक अतिरिक्त बोनस के रूप में विधि में एक त्रुटि होती है: आकार 7 लौटाता है, न कि 5। – mgr326639

संबंधित मुद्दे