2016-11-22 6 views
1

우리는 컴퓨터 환경에 MDT를 사용합니다. 우리는 스크립트를 사용하여 IP 위치에 기반한 컴퓨터의 이름을 지정하고 스크립트는 데이터를 데이터베이스에 씁니다. 컴퓨터 이름을 구성하기위한 추가 조건 섹션을 포함하도록 스크립트를 수정해야합니다. 아래 스크립트에서 섀시 유형의 추가 조건을 사용하는 부분에 문제가 있습니다.ChassisType을 사용하여 Select Case에 대한 다중 조건

내가 도움이 필요한 부분은

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

위의 수정. 섀시 유형의 여러 조건으로 인해 어려움을 겪고 있음을 분명히 알았습니다. 나는 그들을 어떻게 적절하게 결합 시킬지 모른다. 스크립트가 결과를 반환하지 않고 "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 x=1 And y=3 Then 
    ... 
ElseIf x=2 And y<5 Then 
    ... 
ElseIf y>2 And z-x=4 Then 
    ... 
Else 
    ... 
End If 

*이 가두 연설 말했다와 *

을 단계, 최초의 세 가지 조건 중 하나가 처음으로 일치 한 것이기 때문에 당신도, 세 가지 추가 검사에 결코 것입니다 귀하의 경우. 귀하의 진술을 만들기위한 간단한 조건들 전에 결합 된 조건들을 넣어야 할 것입니다.

If strChassisType >= 8 And strChassisType <= 10 Then 

을 수행합니다 : 당신의 가치는 숫자 있다면 당신이 할 수있는 일

            
 
             
  strChassisType = 8,9 Or 10
            
 

이 같은 사용의 비교 작업을하다 : 또한,이 같은 여러 값에 대한 변수를 확인할 수 없습니다 사전 조회 :

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

또는은 presenc 확인하는 함수를 정의 Contains 배열에 값의 전자 :

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 

조건의 두 번째 세트는 기본적으로 그냥 내가 아마 정확히 할 거라고 조건의 첫 번째 집합의 결과를 수정하는 것 때문에 : 조건의 첫 번째 집합의 결과를 수정 . IP 주소에서 관련 서브넷을 분할 할 때는 Split(strIP, ".")을 사용하십시오.

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