Skip navigation

So similarly to the logging class object I posted back on December 16th; I’m posting a dictionary wrapper object I’ve built to enhance it’s (scripting.dictionary) usage for creating indexed arrays, concatenating strings, etc…

As with the Logging class object, it must be instantiated to use, so…

Dim Dict
Set Dict = New cls_Dict
  
Call Dict.Add("stuff","my message")
    Wscript.Echo Dict.Key("stuff")
 
Wscript.Quit(0)

The object code is below, I’ll give a walkthrough on it’s usage after the code.

'============================================================================
'Dictionary Class ===========================================================
'============================================================================
 
Class cls_Dict
'Class wrapper for the scripting.dictionary
    Private oDict, oNet, Comparemode, strSplit, oFso, oWShell
 
'---------------------------------------------------------
 
Private Sub Class_Initialize()
'Dictionary class init subroutine   
    If Debugmode Then On Error Goto 0 Else On Error Resume Next
        Set oDict   = CreateObject("Scripting.Dictionary")
        Set oNet    = CreateObject("Wscript.Network")
        Set oFso    = CreateObject("Scripting.FileSystemObject")
        Set oWShell = CreateObject("Wscript.Shell")
        oDict.CompareMode = 1
            strSplit = "|:|"
        Call oDict.Add("CurrentDir",Left(WScript.ScriptFullName, _
            (Len(WScript.ScriptFullName)-Len(WScript.ScriptName))))
        Call oDict.Add("computername", oNet.Computername)
        Call oDict.Add("Windir",LCase(oWShell.ExpandEnvironmentStrings _
            ("%windir%")))
        Call oDict.Add("CurrentUser",LCase(oNet.UserName))
        Call SetOsVer
End Sub
 
'---------------------------------------------------------
 
Private Sub Class_Terminate()
'Dictionary class termination subroutine
    If IsObject(oDict) then Set oDict = Nothing
End Sub
 
'---------------------------------------------------------
 
Public Property Get CurrentDir
'Returns Current Directory for the script
    CurrentDir = oDict.Item("CurrentDir")
End Property
 
'---------------------------------------------------------
 
Public Property Get ComputerName
'Returns the machine name for the current machine
    ComputerName = oDict.Item("computername")
End Property
 
'---------------------------------------------------------
 
Public Property Get CurrentUser
'Returns the machine name for the current machine
    CurrentUser = oDict.Item("CurrentUser")
End Property
 
'---------------------------------------------------------
 
Public Property Get Windir
'Returns the windows directory for the local machine
    Windir = oDict.Item("windir")
End Property
 
Public Property Get SystemRoot
'Returns the appropriate system directory system32 or syswow64
 
    If InStr(StrReverse(oDict.Item("CurrentOsVer")), "46x") <> 0 Then
        SystemRoot = Windir & "\syswow64"
    Else
        SystemRoot = Windir & "\system32"
    End If
 
End Property
'---------------------------------------------------------
 
Public Sub Add(strKey,strValue)
'Method to Add a key and item
    If Debugmode Then On Error Goto 0 Else On Error Resume Next
 
    Dim EnvVariable, strSplit
 
        strSplit = Split(strValue, "%")
    If IsArray(strSplit) Then
        EnvVariable = oWShell.ExpandEnvironmentStrings _
            ("%" & strSplit(1) & "%")
        strValue = strSplit(0) & EnvVariable & strSplit(2)
                If strValue = "" Then
                    strValue = strSplit(0)
                End If
    End If
    If oDict.Exists(strKey) Then
        oDict(strKey) = Trim(strValue)
    Else
        oDict.Add strKey, Trim(strValue)
    End If
End Sub
 
'---------------------------------------------------------
 
Public Function Exists( strkey)
'Method to check existance of a key
    If Debugmode Then On Error Goto 0 Else On Error Resume Next
     
    If oDict.Exists(strKey) then
        Exists = True
    Else
        Exists = False
    End If
 
End Function
 
'---------------------------------------------------------
 
Public Function Keys()
'Method to retrieve an array of keys
    If Debugmode Then On Error Goto 0 Else On Error Resume Next
 
    If IsObject(oDict) Then
        Keys = oDict.Keys
    End If
End Function
 
'---------------------------------------------------------
 
Public Function Items()
'Method to retrieve an array of items
    If Debugmode Then On Error Goto 0 Else On Error Resume Next
 
    If IsObject(oDict) Then
        Items = oDict.Items
    End If
End Function
 
'---------------------------------------------------------
Private Sub SetOsVer()
'Sets a comparable OSVer key item into the dictionary
        If DebugMode Then On Error Goto 0 Else On Error Resume Next
 
        Dim x, VersionCheck
         
    VersionCheck = owShell.RegRead("HKLM\software\microsoft\" _
                    & "windows nt\currentversion\productname")
 
            If ofso.folderexists("c:\windows\syswow64") Then
                x = "x64"
            Else
                x = "x86"
            End If
        Call oDict.Add("CurrentOsVer",VersionCheck & " " & x)
End Sub
    Public Property Get OsVer()
        OsVer = oDict.Item("CurrentOsVer")
    End Property
 
'---------------------------------------------------------
Public Property Get AppName()
 
    AppName = Left(WScript.ScriptName, Len(WScript.ScriptName) - 4)
End Property
 
'---------------------------------------------------------
 
Public Property Get Key( strKey)
'Property to retrieve item value from specific key
    If Debugmode Then On Error Goto 0 Else On Error Resume Next
 
        Key = Empty
    If IsObject(oDict) Then
        If oDict.Exists(strKey) Then Key = oDict.Item(strKey)
    End If
End Property
 
'---------------------------------------------------------
 
Public Sub ItemJoin(strKey, strItem)
'Method to concactenate new items under one key at the end of the string
    If Debugmode Then On Error Goto 0 Else On Error Resume Next
    Dim concat
    If Not oDict.Exists(strKey) Then
        Call oDict.Add(strkey, stritem)
    Else
        concat = oDict.Item(strKey)
        concat = concat & " " & strItem
            oDict.Remove(strKey)
        Call oDict.Add(strKey,concat)
    End If
End Sub
 
'---------------------------------------------------------
 
Public Sub ItemList( strKey,  strItem)
'Method to concactenate new items under one key at the end of the string
    If Debugmode Then On Error Goto 0 Else On Error Resume Next
    Dim concat
    If Not oDict.Exists(strKey) Then
        Call oDict.Add(strkey, stritem)
    Else
        concat = oDict.Item(strKey)
        concat = concat & "|:|" & strItem
            oDict.Remove(strKey)
        Call oDict.Add(strKey,concat)
    End If
End Sub
 
'---------------------------------------------------------
 
Public Sub ItemJoinRev( strKey,  strItem)
'Method to concactenate new items under one key at the start of the string
    If Debugmode Then On Error Goto 0 Else On Error Resume Next
    Dim concat
    If Not oDict.Exists(strKey) Then
        Call oDict.Add(strkey, stritem)
        Exit Sub
    Else
        concat = oDict.Item(strKey)
        concat = strItem & " " & concat
            oDict.Remove(strKey)
        Call oDict.Add(strKey,concat)
    End If
End Sub
     
'--------------------------------------------------------- 
 
Public Function ReturnArray( strKey)
'Method to return an item as an array
    If Debugmode Then On Error Goto 0 Else On Error Resume Next
     
    Dim ItemToSplit, ItemArray
     
    ItemToSplit = oDict.item(strKey)
     
    ItemArray = Split(ItemToSplit, strSplit)
     
    ReturnArray = ItemArray
     
End Function
     
'--------------------------------------------------------- 
 
Public Sub Remove( strKey)
'Method to remove a key value
    oDict.Remove(strKey)
End Sub
 
'---------------------------------------------------------
 
Public Sub RemoveAll()
'Method to remove all data from the dictionary
    oDict.RemoveAll
End Sub
 
End Class

 

So let’s look at the exposed functionality added to or exposed from the scripting dictionary by this object. 

Methods:

 

  • Add

Modified to resolve and accept environment variables, and is also the sole method for adding and replacing keys and their item values

  • ItemJoin

Concatenates the item value to the end of the existing key item

  • ItemJoinRev

Concatenates the item value to the beginning of the existing key item

  • ItemList

Creates an array under an existing key or creates if it doesn’t exist

  • ReturnArray

Returns an array if array exists under the key

  • Exists

Checks if key exists, returns boolean value

  • Items

Returns all items in an array

  • Keys

Returns all keys in an array

  • Remove

Remove a key and item value

  • RemoveAll

Dump entire contents of the dictionary object

 

Properties:

 

  • Key

This is modified from the original usage, and returns the item for the given key. Add is used to modify the key only.

  • AppName

Returns script name, minus extension value

  • ComputerName

Returns the netbios name of the machine

  • CurrentDir

Returns the current working directory of the script

  • CurrentUser

Returns the current logged on user ID (or executing id)

  • OsVer

Returns a OS Version and arch

  • SystemRoot

Returns the environment path for the system root

  • Windir

Returns the environment path for the Windows directory


Feel free to hit me up about usage or any other questions you might have regarding why I did things a certain way, or with any changes you might have made to improve this code.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.