2016-11-22 73 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