web-dev-qa-db-ja.com

文字列が文字列のリストにあるかどうかを確認します

コンテキスト:ifループを使用して、すべてのVMのリストを取得し、フィルターして、$MachineListの値で始まる名前のVMのみを返すAPIを作成しています。

サーバーのリストは2つに分かれています。

  • セット1:srv-a-1、srv-a-2、srv-b-1、srv-b-2、srv-c-1、srv-c-2など.
  • セット2:tst-a-1、tst-a-2、tst-b-1、tst-b-2、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

マシンリストの値と一致するアイテムのみを返そうとしていますが、これはマシンの完全なリスト(srv *とtst *の両方)を返しています。

6
joebegborg07

何よりもまず、$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) {
    ...
}
8
Ansgar Wiechers