上下文:
我们正在制作一个API来获取所有虚拟机的列表,并使用if循环对其进行过滤,以仅返回名称仅以$MachineList
中的值开头的虚拟机。
服务器列表分为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 *)。
答案 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
}