Where 对象作为变量

Where object as variable

阅读此处发布的许多解决方案后,none 完全适用我的解决方案。 这有效(returns 基于标准的 instanceNames 预期数量):

$response.result | Where-Object {$_.targetType -eq "webserver" -and ($_.agentHostName -eq "ServerA" -or $_.agentHostName -eq "ServerB")} | select-Object "instanceName"

但是,由于可能会找到 n 个服务器,我创建了一个循环来动态创建此查询:

    [System.Text.StringBuilder]$clause = " {`$_.targetType -eq ""webserver"" -and (" 
    $i = 1;
    foreach ($server in $serversArray) {
    
        if ( $i -eq $serversArray.Count ) {
            $clause.Append("`$_.agentHostName -eq ""${server}"")}")
        } else {
            $clause.Append( "`$_.agentHostName -eq ""${server}"" -or ")
        }   
        $i++
    }
    $clause.Append(" | select-Object ""instanceName""")

$filter = [scriptblock]::Create($clause)
$instances = $response.result | where-object $filter 

调试: $clause 变量包含:

{$_.targetType -eq "webserver" -and ($_.agentHostName -eq "serverA" -or $_.agentHostName -eq "serverB")} | select-Object "instanceName"

但是,它 returns 所有实例名称(未过滤)而不是符合条件的实例名称。我在这里做错了什么?

-in 运算符可以简化您的代码。例如:

$response.result | 
    Where-Object {($_.targetType -eq 'webserver') -and ($_.agentHostName -in $serversArray)} |
    Select-Object 'instanceName'