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

Powershell Filtering with Where-Object not applying

我在使用以下代码时遇到问题:

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

通常这应该从主机列表中过滤出列表中的 "Host001.Domain.tld"。 (Host001 到 Host014 是此列表通常生成的内容,未过滤)。

但是,当 运行 脚本块并查看 $NodeList 变量中的内容时,我得到了每个对象,就好像没有应用过滤器一样。

我已经尝试调试了几个小时,但无济于事。

谁能指出我的错误?

此致,

Get-SCVMHostCluster ClusterName returns 单个簇对象。

当您将其通过管道传输到 Where-Object 时,您将得到以下内容:

  1. $_.Nodesfullyqualifieddomainname 属性 类型 string
  2. 的对象集合
  3. $_.Nodes.fullyqualifieddomainname因此是字符串集合的集合

Where-Object 只会折叠第一个 "level" 集合,它不会更深 - 因此你的过滤器永远不会匹配任何东西,字符串数组的集合永远不会匹配单独的字符串你在比较。

这是我会做的,通过选择 Nodes 属性 来折叠第一层(为了便于阅读而分成语句,请随意将其放在一个语句中):

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