joe*_*g07 3 powershell loops windows-services
上下文:我们正在制作一个API,以获取所有VM的列表,并使用if循环对其进行过滤,以仅返回名称仅以中的值开头的VM $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
Run Code Online (Sandbox Code Playgroud)
我们试图仅返回与计算机列表中的值匹配的项目,但是这将返回完整的计算机列表(包括srv *和tst *)。
首先,$MachineList = "srv-a*" -or "srv-b*" -or ...不会做您显然认为会做的事情。这是一个布尔表达式,其结果为$true,因为PowerShell会$true在布尔上下文中解释非空字符串。如果需要定义值列表,请定义值列表:
$MachineList = "srv-a*", "srv-b*", ...
Run Code Online (Sandbox Code Playgroud)
另外,-contains运算符会进行精确匹配(这意味着它将检查数组中的任何值是否等于参考值)。对于通配符匹配,您需要一个嵌套Where-Object过滤器
$MachineList = "srv-a*", "srv-b*", "srv-c*", ...
...
if ($MachineList | Where-Object {$Machine.Name -like $_}) {
...
}
Run Code Online (Sandbox Code Playgroud)
不过,在这种情况下,更好的方法是使用正则表达式匹配,例如:
$pattern = '^srv-[a-l]'
...
if ($Machine.Name -match $pattern) {
...
}
Run Code Online (Sandbox Code Playgroud)