【问题标题】:Where object as variable对象作为变量
【发布时间】:2021-11-09 21:36:45
【问题描述】:

在阅读了此处发布的许多解决方案后,没有一个完全适用于我的解决方案。 这有效(根据条件返回预期的实例名称数量):

$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"

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

【问题讨论】:

  • 为什么不使用-in 运算符?例如:$response.result | Where-Object {($_.targetType -eq "webserver") -and ($_.agentHostName -in $serversArray)} | select-Object "instanceName".
  • 这是获取唯一服务器的一种非常奇怪且昂贵的方式。对于您正在尝试的内容,您可能只需要提供过滤器:$filter = [scriptblock]::Create('$_.targetType -eq "webserver" -and ($_.agentHostName -eq "serverA" -or $_.agentHostName -eq "serverB")') 而不是Select-Object。无论如何,还有其他快速方法可以选择唯一的项目,例如使用哈希集:见:stackoverflow.com/a/69135364/1701026

标签: powershell where-clause


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 2022-12-13
    • 2013-07-26
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多