【问题标题】:Powershell Filtering with Where-Object not applying不应用 Where-Object 的 Powershell 过滤
【发布时间】:2015-02-10 01:45:50
【问题描述】:

以下代码有问题:

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

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

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

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

谁能指出我的错误?

问候,

【问题讨论】:

  • 如果你执行get-scvmhostcluster ClusterName| foreach-object {$_.nodes.fullyqualifieddomainname},你会得到任何值吗?
  • 是的,我得到了集群中主机的所有 FQDN。
  • fullyqualifieddomainname 是一个字符串吗?如果你在 where-object 块上放一个断点,然后检查 $_.nodes.fullyqualifieddomainname.GetType() 你会得到什么?
  • 我还想知道导致比较失败的字符串上是否有空格。也许你会从where-object {$_.nodes.fullyqualifieddomainname -notlike "*Host001.Domain.Tld*"}得到结果
  • 马特,没有空格(你的代码块没有改变任何东西)米奇,字符串对象是的

标签: powershell filtering


【解决方案1】:

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

当您通过管道将其发送到 Where-Object 时,您将获得以下信息:

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

Where-Object 只会折叠集合的第一个“级别”,它不会更深入 - 因此您的过滤器永远不会匹配任何内容,字符串数组的集合永远不会匹配您正在比较的唯一字符串。

这就是我要做的,通过选择Nodes 属性来折叠第一层(为了便于阅读,将其分解为语句,请随意在一个语句中使用管道):

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

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2018-11-30
    相关资源
    最近更新 更多