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.