【问题标题】:Compare-Object resulting in incorrect results比较对象导致不正确的结果
【发布时间】:2019-05-29 10:38:47
【问题描述】:

当尝试对两个 PC 名称列表使用 Compare-Object 时,结果是来自一个项目的服务器名称列表,而 System.Object[] 用于另一个。这两个项目都是字符串类型,所以我不确定为什么会这样。

我的两个列表名称是 $SCC$windowsWorkstations。当我运行$SCC 时,它会返回一个 PC 名称列表。当我运行$windowsWorkstations.Name 时,它还会返回一个PC 名称列表。两者都是字符串类型。

澄清一下,$windowsWorkstationsobject 类型,但 $windowsWorkstations.NameString 类型。

Compare-Object -ReferenceObject $SCC -DifferenceObject $windowsWorkstations.Name -IncludeEqual

结果是一个列表,其中包含来自$SCC 的所有 PC 名称,=> 作为侧面指示符。列表中的最后一项是System.Object[],其中<= 作为侧面指示符。

InputObject SideIndicator ------------ ------------- PC53127 => 系统对象[]

注意我缩短了比较对象的结果,因为$SCC 上有 15,000 多个 PC 名称。我只以 1 为例。

什么会使这个比较的结果是System.Object[]?不能比较psobjects吗?

【问题讨论】:

  • 指标显示PC53127 仅在$windowsWorkstations.Name 集合中,而System.Object[] 仅在$SCC 集合中。所以……您是否已全面审查过该收藏的内容?看来你里面有些东西不是你所期望的......
  • 这更有意义。我认为是 $windowsWorkstation 有问题,而不是 $SCC。我认为问题在于我在比较之前转换了 $SCC.ToString(),从而得到了 System.Object[]。你能比较一个 Object[] 和一个字符串吗?每次我尝试它,它都会开始运行并且永不停止。
  • 如何获取列表的内容? Get-Content/Import-Csv,ConvertFrom-*?您确实将 .Name 属性附加到 $windowsWorkstations 而不是 $SCC
  • @JK72 - 您需要查看$SCC 的结构。尝试通常的方法 - 首先将其提供给 Get-Member 并查看它。然后将$SCC[0] 提供给Select-Object -Property * 并查看结果。 otta 为您提供了您想要与其他集合中的字符串值进行比较的特定属性。

标签: powershell csv compare


【解决方案1】:

在对象上调用ToString() 会为您提供该对象的字符串表示形式。在许多情况下,字符串表示只是对象的类型名称。在您的特定情况下,$SCC 似乎是一个对象数组,因此在其上调用 ToString() 会为您提供类型名称 System.Object[]

演示:

PS C:\> $v = Get-ChildItem PS C:\> $v.ToString() 系统对象[]

如果$SCC 的元素是字符串,那么您问题的比较应该就可以了。只是不要先将$SCC 转换为字符串。

如果$SCC 的元素不是字符串,您需要使用有关该变量内容的更多信息来更新您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多