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

标签 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*)。

最佳答案

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

关于powershell - 检查字符串是否在字符串列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47096341/

相关文章:

java - 执行我的 java 代码时 cmd 访问被拒绝

sockets - 如何在 Telnet 中创建 HTTP 请求

Powershell:为什么 Rename-Item 不能作为管道命令使用?

node.js - 如何使用 Express 将 powershell 命令结果推送到 NodeJs 中的 json 响应?

powershell - 如何从锁定状态中释放 (get-item c :\temp\a. log).OpenRead()?

c# - 找出Windows服务的运行进程名称.NET 1.1

java - for 循环到 while 循环

java - 无法使字符串相等方法和将字符串转换为数字一起工作。

javascript - Javascript 循环内的事件处理程序 - 需要闭包吗?

java - 如何使java应用程序成为windows服务?