![Powershell - 检查字符串是否在字符串列表中](https://linux22.com/image/712929/Powershell%20-%20%E6%A3%80%E6%9F%A5%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%98%AF%E5%90%A6%E5%9C%A8%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%88%97%E8%A1%A8%E4%B8%AD.png)
背景:我们正在制作一个 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”属性)的条目。
我希望这是有道理的。这不是我自己发现的,而是前段时间通过互联网搜索找到了答案。