2017-11-03 6 views
0

컨텍스트 : if 루프를 사용하여 모든 VM 목록 및 필터를 가져 오는 API를 만들고 이름이 $MachineList 인 VM 만 반환합니다.문자열이 문자열 목록에 있는지 확인합니다.

서버 목록 2 분할되어 SRV-A-1, SRV-A-2, SRV-B-1, SRV-B-2, SRV-C- :

  • 1 세트 1, tst-b-2, tst-c-1, tst-c-1, tst-c-2 등이있다.

    $EnvironmentList = "Environments-4" -or "Environments-5" -or "Environments-41" -or "Environments-61" 
    $MachineList = "srv-a*" -or "srv-b*" -or "srv-c*" -or "srv-d*" -or "srv-e*" -or "srv-f*" -or "srv-g*" -or "srv-h*" -or" srv-i*" -or "srv-j*" -or "srv-k*" -or "srv-l*" 
    
    function CheckService { 
        $MachinesRequest = (Invoke-WebRequest -Method Get -Headers @{"X-system-ApiKey"="Hashed-API-Key-Value"} -URI https://url-to-site.local/api/machines/all).Content | ConvertFrom-Json 
        foreach ($Machine in $MachinesRequest) { 
         if ($EnvironmentList -contains $Machine.EnvironmentIds) { 
          if ($MachineList -contains $Machine.Name) { 
           $Machine.Name 
          } 
         } 
        } 
    } 
    
    CheckService 
    

    우리는 단지 ITE를 반환하려는 : 2 등

이것은 스크립트입니다 ms하지만 기계 목록의 값과 일치하지만 기계의 전체 목록 (srv * 및 tst * 모두)을 반환합니다.

답변

1

우선적으로 $MachineList = "srv-a*" or "srv-b*" -or ...은 분명히 그렇게 생각하는 것을 수행하지 않습니다. PowerShell은 불린 문자열을 $true으로 부울 컨텍스트에서 해석하기 때문에 $true으로 평가되는 부울 식입니다. 만약 값의리스트를 정의 할 경우, 값의리스트를 정의 다음 -contains 조작자가 정확히 일치 않으며, 또한

$MachineList = "srv-a*", "srv-b*", ... 

을 (어레이 내의 임의의 값이 기준 값과 동일한 경우에 수표 의미) . 와일드 카드가 중첩 Where-Object 필터를 필요 일치하는

$MachineList = "srv-a*", "srv-b*", "srv-c*", ... 
... 
if ($MachineList | Where-Object {$Machine.Name -like $_}) { 
    ... 
} 

이 시나리오에서 더 나은 방법 비록 정규 표현식 매치, 예컨대 :

$pattern = '^srv-[a-l]' 
... 
if ($Machine.Name -match $pattern) { 
    ... 
}