2016-11-22 41 views
1

我们在我们的环境中使用MDT对计算机进行映像。我们正在使用脚本来命名基于IP位置的计算机,然后脚本将数据写入数据库。我需要修改脚本以包含一部分附加条件来构造计算机名称。我在下面的脚本中遇到了使用机箱类型附加条件的部分有问题。使用ChassisType选择案例的多个条件

我需要帮助的部分是

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" 

我想有这三个条件的工作,并设置根据现场的情况,然后机箱类型的站点代码,但我不知道如何使用多种条件或如何组合底盘类型并希望得到指导。

以下是完整的脚本

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 
+1

欢迎来到StackOverflow。您似乎没有指定代码出了什么问题,您得到了什么错误,或者期望的结果是什么。这将使其不太可能为您的问题吸引高质量的答案。 –

+1

上面的编辑。我认为我很清楚,我在Chassis类型的多种条件下遇到困难。我不知道如何正确合并它们。该脚本没有返回结果,并且它是“Expected”的错误)“ – MarliejoS5

回答

2

如果你想除非你想匹配任何人(逗号意味着你有一个使用多个条件在Case声明,你需要将它们与逻辑运算符连接列出几个独立的条件)。

声明

Select Case True 
    Case x=1, y=2 
    ... 
End Select 

比赛如果x具有值1或y具有值2。

声明

Select Case True 
    Case x=1 And y=2 
    ... 
End Select 

比赛如果x具有值1 y的值为2.

但是,我个人认为这是滥用Select语句,因为它们通常意味着根据一个变量或表达式的不同值进行分支。

Select Case x 
    Case 1 
    'do some 
    Case 2 
    'do other 
    Case Else 
    'didn't expect this value 
End Select 

我更喜欢If..ElseIf..Else语句来检查多个不同的条件。

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 

*走下肥皂盒*

虽这么说,你的情况,你甚至从来没有获得三个额外的检查,因为前三个条件之一就已经先匹配。您需要在简单条件之前加入综合条件才能使您的声明有效。此外,您不能检查这样对多个值的变量:

            
 
             
  strChassisType = 8,9 Or 10
            
 

你可以做的是这样使用比较操作,如果你的价值观都是数字:

If strChassisType >= 8 And strChassisType <= 10 Then 

做字典查询:

chassisTypes = CreateObject("Scripting.Dictionary") 
chassisTypes.Add "8", True 
chassisTypes.Add "9", True 
chassisTypes.Add "10", True 
... 
If chassisTypes.Exists(strChassisType) Then 

或定义一个Contains函数来检查presenc在数组中的值E:

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 

因为你的第二组条件将基本上只需要修改第一组条件的结果,我可能会做的正是:修改第一组条件的结果。也可以使用Split(strIP, ".")从IP地址中拆分相关的子网。

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 
+0

令人敬畏的故障和问题的解释。 – Lankymart

+0

这真是太棒了,它让我不仅能够找到解决方案,还能理解寻找解决方案的过程以及我在最初的尝试中出错的地方。谢谢。 – MarliejoS5