【发布时间】: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