使用Where-Object的Powershell过滤不适用

时间:2015-02-09 09:32:20

标签: powershell filtering

我遇到以下代码问题:

$NodeList = (get-scvmhostcluster ClusterName| where-object {$_.nodes.fullyqualifieddomainname -ne "Host001.Domain.Tld"}).nodes.fullyqualifieddomainname

通常这应该从主机列表中筛选出“Host001.Domain.tld”。 (Host001到Host014是这个列表通常生成的,未经过滤的。)

然而,当运行脚本块并查看$ NodeList变量中的什么时,我得到每个对象,好像没有应用过滤器一样。

我一直在尝试调试这几个小时,但无济于事。

任何人都能指出我的错误吗?

此致

1 个答案:

答案 0 :(得分:1)

Get-SCVMHostCluster ClusterName返回单个群集对象。

当您将其发送到Where-Object时,您有以下内容:

  1. $_.Nodes是具有fullyqualifieddomainname类型string属性的对象的集合
  2. $_.Nodes.fullyqualifieddomainname因此是字符串集合的集合
  3. Where-Object只会崩溃第一个"等级"对于集合,它不会更深入 - 因此你的过滤器永远不会匹配任何东西,字符串数组的集合永远不会匹配你正在比较的唯一字符串。

    以下是我要做的事情,通过选择Nodes属性来折叠第一级(为了便于阅读而将其分解为语句,随意将其括在一个语句中):

    $Nodes = Get-SCVMHostCluster ClusterName|Select-Object -ExpandProperty Nodes
    $NodeList = $Nodes |Where-Object {$_.fullyqualifieddomainname -ne "Host001.domain.tld"}|Select-Object -ExpandProperty fullyqualifieddomainname