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

时间:2017-11-03 12:56:01

标签: powershell loops windows-services

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

服务器列表分为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 *)。

2 个答案:

答案 0 :(得分:3)

首先,$MachineList = "srv-a*" -or "srv-b*" -or ...不会做你认为它做的事情。它是一个布尔表达式,其计算结果为$true,因为PowerShell在布尔上下文中将非空字符串解释为$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) {
    ...
}

答案 1 :(得分:0)

使用 -eq 进行精确匹配。使用 -match 或 -contains 进行部分字符串匹配

$my_list='manager','coordinator','engineer', 'project engineer',
$retval=$False
if ($dd_and_pm -eq "engineer")
{
    $retval=$True
}