- Designing the Script
- Writing Functions and Subroutines
- Writing the Main Script
- Testing the Script
- Review
Writing Functions and Subroutines
The one bit of functionality that seems to be standalone is the code generated by the wizard, which will do my WMI querying for me. I may need to use that code in another script someday, and I'll definitely be using it over and over in the script I'm writing now, so it makes sense to write it as a function.
I want the function to accept a computer name, query that computer for specific operating system information, and then compile all that information into a neatly formatted string. The function should return the string to the main script, which can then write it to a file or whatever.
Adapting the wizard's code isn't too difficult. Listing 20.2 shows my new GetOSIno() function. Note that this isn't intended to be run as a standalone script; as a function, it must be called by another script, which must provide the name of the computer to connect to as the function's input parameter.
Listing 20.2. GetOSInfo.vbs. This function queries a computer's operating system information and returns the results in a string.
Function GetOSInfo(sComputer) 'declare variables Dim objWMIService Dim colItems Dim strOutput 'get WMI service Set objWMIService = GetObject("winmgmts:\\" & _ strComputer & "\root\cimv2") 'get item collection Set colItems = objWMIService.ExecQuery( _ "Select * from Win32_OperatingSystem",,48) 'init output string sOutput = String(70,"-") sOutput = sOutput & sComputer 'append info to output string For Each objItem in colItems strOutput = strOutput & "BuildNumber: " & _ objItem.BuildNumber & vbCrLf strOutput = strOutput & "BuildType: " & _ objItem.BuildType & vbCrLf strOutput = strOutput & "Caption: " & _ objItem.Caption & vbCrLf strOutput = strOutput & "EncryptionLevel: " & _ objItem.EncryptionLevel & vbCrLf strOutput = strOutput & "InstallDate: " & _ objItem.InstallDate & vbCrLf strOutput = strOutput & "Manufacturer: " & _ objItem.Manufacturer & vbCrLf strOutput = strOutput & "MaxNumberOfProcesses: " & _ objItem.MaxNumberOfProcesses & vbCrLf strOutput = strOutput & "MaxProcessMemorySize: " & _ objItem.MaxProcessMemorySize & vbCrLf strOutput = strOutput & "Name: " & _ objItem.Name & vbCrLf strOutput = strOutput & _ "NumberOfLicensedUsers: " & _ objItem.NumberOfLicensedUsers & vbCrLf strOutput = strOutput & "NumberOfProcesses: " & _ objItem.NumberOfProcesses & vbCrLf strOutput = strOutput & "NumberOfUsers: " & _ objItem.NumberOfUsers & vbCrLf strOutput = strOutput & "OSProductSuite: " & _ objItem.OSProductSuite & vbCrLf strOutput = strOutput & "OSType: " & _ objItem.OSType & vbCrLf strOutput = strOutput & "OtherTypeDescription: " & _ objItem.OtherTypeDescription & vbCrLf strOutput = strOutput & "Primary: " & _ objItem.Primary & vbCrLf strOutput = strOutput & "ProductType: " & _ objItem.ProductType & vbCrLf strOutput = strOutput & "RegisteredUser: " & _ objItem.RegisteredUser & vbCrLf strOutput = strOutput & "SerialNumber: " & _ objItem.SerialNumber & vbCrLf strOutput = strOutput & _ "ServicePackMajorVersion: " & _ objItem.ServicePackMajorVersion & vbCrLf strOutput = strOutput & _ "ServicePackMinorVersion: " & _ objItem.ServicePackMinorVersion & vbCrLf strOutput = strOutput & "Version: " & _ objItem.Version & vbCrLf strOutput = strOutput & "WindowsDirectory: " & _ objItem.WindowsDirectory & vbCrLf Next 'return results GetOSInfo = sOutput End Function
I didn't have to do much to adapt the script. First, I deleted all the lines that I didn't want in my script. I changed all the WScript.Echo commands to strOutput = strOutput &, which appends the information into a string rather than displays it in a message box. I also added & vbCrLf to the end of each line, which adds a carriage return and linefeed character. Those help keep the final output file looking nice.
I also dressed up the code at the beginning of the function.
'declare variables Dim objWMIService Dim colItems Dim strOutput 'get WMI service Set objWMIService = GetObject("winmgmts:\\" & _ strComputer & "\root\cimv2") 'get item collection Set colItems = objWMIService.ExecQuery( _ "Select * from Win32_OperatingSystem",,48) 'init output string sOutput = String(70,"-") sOutput = sOutput & sComputer
I added some comments to document the codePrimalScript isn't so good about thatand I initialized my sOutput variable. I also started sOutput off to contain a line of 70 hyphens, and the name of the computer I'm querying. These extra touches help make the final output file easier to read and more useful.