Powershell - 检查字符串是否在字符串列表中

Powershell - 检查字符串是否在字符串列表中

背景:我们正在制作一个 API 来获取所有虚拟机的列表并使用 if 循环对其进行过滤,以仅返回名称以 $MachineList 中的值开头的虚拟机。

服务器列表分为两部分:

  • 集合 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*)。

非常感谢您的帮助。

提前致谢。

答案1

用 定义变量-or只会导致变量包含True,而不包含任何其他内容:

PS C:\> $EnvironmentList = "Environments-4" -or "Environments-5" -or "Environments-41" -or "Environments-61"
PS C:\> $EnvironmentList
True

要存储所有这些值,您需要将列表定义为数组:

$EnvironmentList = "Environments-4","Environments-5" #,...
$MachineList = "srv-a*","srv-b*","srv-c*" #,...

此外,-contains不适用于通配符,您必须使用通配符-like才能使用它们。

例子:

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){
            foreach ($Test in $MachineList) {
                if($Machine.Name -like $Test){
                        $Machine.Name               
                }
            }
        }
    }
}

答案2

我过去发现的最接近您所问的问题的是 Where-Object 的“-in”参数。但是,我不确定它是否适用于通配符。您需要进行测试/实验才能找到答案。

我的实际例子:

$entries | Where-Object -Property account -In $accounts.account

其中 $entries 包含我想要过滤的大量账户列表,而 $accounts 包含我想要过滤的少量账户列表。此命令仅返回 $entries 中包含 $accounts 中列出的账户之一(“account”属性)的条目。

我希望这是有道理的。这不是我自己发现的,而是前段时间通过互联网搜索找到了答案。

相关内容