We use MDT in our environment to image computers. We are using a script in order to name computers based on IP location and the script then writes the data to a database. I need to modify the script to include a section of additional conditions to construct the computer name. I am having difficulty with the portion that uses the additional condition of Chassis type in the script below.
The portion I need help with is
Case (InStr(1, strIP, ".111.")>0),(strChassisType = 8,9 Or 10)
strSiteCode="UKL"
Case (InStr(1, strIP, ".112.")>0),(strChassisType = 8,9 Or 10)
strSiteCode="NYL"
Case (InStr(1, strIP, ".113.")>0),(strChassisType = 8,9 Or 10)
strSiteCode="HKL"
I would like to have these three conditions work and set the site code based on the condition of Site and then chassis type, but I am not sure how to use multiple conditions or how to combine the chassis type and would like guidance.
Following is the full script
Function UserExit(sType, sWhen, sDetail, bSkip)
oLogging.CreateEntry "entered UserExit ", LogTypeInfo
UserExit = Success
End Function
Function computerName()
'On Error Resume Next
Dim strSerial,strAsset, strManufacturer, strIP, strSiteCode
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set WSHShell = CreateObject("WScript.Shell")
'----Establish SQL Connection----
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=sqloledb;Data Source=XXXXXXXX;Initial Catalog=NetMetrics;User Id=netmetrics;Password=*********;"
'----Determine local Service & Asset Tags----
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSMBIOS = objWMIService.ExecQuery _
("Select * from Win32_SystemEnclosure")
For Each objSMBIOS In colSMBIOS
strManufacturer = objSMBIOS.Manufacturer
strSerial = objSMBIOS.SerialNumber
Next
'----Determine Site Code based upon IP address----
Set IPConfigSet = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")
For Each IPConfig In IPConfigSet
If Not IsNull(IPConfig.IPAddress) Then
For i = LBound(IPConfig.IPAddress) To UBound(IPConfig.IPAddress)
strIP = strIP + IPConfig.IPAddress(i)
Next
End If
Next
Set colChassis = objWMIService.ExecQuery _
("Select * from Win32_SystemEnclosure")
For Each objChassis in colChassis
For Each strChassisType in objChassis.ChassisTypes
Select Case strChassisType
Select Case True
Case (InStr(1, strIP, ".111.")>0)
strSiteCode = "UK"
Case (InStr(1, strIP, ".112.")>0)
strSiteCode = "NY"
Case (InStr(1, strIP, ".113.")>0)
strSiteCode = "HK"
Case (InStr(1, strIP, ".111.")>0),(strChassisType = 8,9 Or 10)
strSiteCode = "UKL"
Case (InStr(1, strIP, ".112.")>0),(strChassisType = 8,9 Or 10)
strSiteCode = "NYL"
Case (InStr(1, strIP, ".113.")>0),(strChassisType = 8,9 Or 10)
strSiteCode = "HKL"
End Select
If (inStr(1,strManufacturer,"Dell")) Then
strSQLQuery = "select count(*) from AssetTags where ServiceTag='" & strSerial & "'"
priorEntry = objConnection.Execute(strSQLQuery)
If priorEntry(0) = 0 Then
strSQLQuery = "select right(concat('00',right(max(assettag),3)+1),3) from AssetTags where AssetTag like '" & strSiteCode & "[^S]%'"
Set arrNewTag = objConnection.Execute(strSQLQuery)
strSQLQuery = "INSERT INTO AssetTags Values ('" & strSerial & "','"& strSiteCode & arrNewTag(0) & "', 'New')"
objConnection.Execute(strSQLQuery)
computerName=(strSiteCode & arrNewTag(0))
Else
strSQLQuery = "select assettag from AssetTags where ServiceTag='" & strSerial & "'"
Set arrNewTag = objConnection.Execute(strSQLQuery)
computerName=(arrNewTag(0))
End If
Else
computerName = "Set Computer Name"
End If
objConnection.Close
End Function
If you want to use multiple conditions in a Case
statement you need to connect them with logical operators unless you want to match any of them (the comma means you have a list with several independent conditions).
A statement
Select Case True
Case x=1, y=2
...
End Select
matches if x
has the value 1 or y
has the value 2.
A statement
Select Case True
Case x=1 And y=2
...
End Select
matches only if x
has the value 1 and y
has the value 2.
However, personally I consider this an abuse of Select
statements since they're normally meant to branch depending on different values of one variable or expression.
Select Case x
Case 1
'do some
Case 2
'do other
Case Else
'didn't expect this value
End Select
I prefer If..ElseIf..Else
statements for checking multiple different conditions.
If x=1 And y=3 Then
...
ElseIf x=2 And y<5 Then
...
ElseIf y>2 And z-x=4 Then
...
Else
...
End If
*steps off soapbox*
With that said, in your case you'd never even get to the three additional checks, because one of the first three conditions would've matched first. You'd need to put the combined conditions before the simple conditions to make your statement work. Also, you can't check a variable against multiple values like this:
strChassisType = 8,9 Or 10
What you can do is use comparison operations like this if your values are numeric:
If strChassisType >= 8 And strChassisType <= 10 Then
do a dictionary lookup:
chassisTypes = CreateObject("Scripting.Dictionary")
chassisTypes.Add "8", True
chassisTypes.Add "9", True
chassisTypes.Add "10", True
...
If chassisTypes.Exists(strChassisType) Then
or define a Contains
function to check for the presence of a value in an array:
Function Contains(a, v)
Contains = False
For Each e In a
If e = v Then
Contains = True
Exit For
End If
Next
End Function
...
If Contains(Array("8", "9", "10"), strChassisType) Then
Since your second set of conditions would basically just modify the result of the first set of conditions I'd probably do exactly that: modify the result of the first set of conditions. And maybe use Split(strIP, ".")
for splitting the relevant subnet from the IP address.
subnet = Split(strIP, ".")(2)
For Each objChassis In colChassis
For Each strChassisType In objChassis.ChassisTypes
Select Case subnet
Case "111": strSiteCode = "UK"
Case "112": strSiteCode = "NY"
Case "113": strSiteCode = "HK"
Case Else
WScript.Echo "Unknown subnet: " & subnet
WScript.Quit 1
End Select
If strChassisType >= 8 And strChassisType <= 10 Then
strSiteCode = strSiteCode & "L"
End If
Next
Next