2017-11-03 17 views
0

コンテキスト: すべてのVMのリストを取得するためのAPIを作成し、ifループを使用してフィルタを適用して、値が$MachineListのVMのみを返すようにします。文字列が文字列のリストにあるかどうかをチェック

サーバのリストは、2つに分割されている:SRV-1、SRV-2、SRV-B-1、SRV-B-2、SRV-C-:

  • 1セット1、tst-b-2、tst-c-1、tst-c-1、tst-c-2、tst-b-1、tst-c-2などが挙げられる。 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を返すようにしようとしていますマシンリストの値と一致するが、これはマシンの全リスト(srv *とtst *の両方)を返す。

答えて

1

まず第一に、$MachineList = "srv-a*" or "srv-b*" -or ...は明らかにそう思わないと思われます。ブール値のコンテキストでは、PowerShellが空でない文字列を$trueと解釈するため、これは$trueと評価されるブール式です。あなたが値のリストを定義する必要がある場合は、値のリストを定義します。

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

また、-containsオペレータは、正確な一致(配列の値のいずれかが基準値と等しい場合、それはチェックの意味)ん。ワイルドカードを使用して、ネストされた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) { 
    ... 
} 
関連する問題