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.