【问题标题】:Powershell select unique fieldPowershell 选择唯一字段
【发布时间】:2018-09-16 13:24:42
【问题描述】:

我有一个包含一些字段的对象列表。例如,我的列表中有三个对象:

Field1 = "aaa"
Field2 = 123
Field3 = "ccc"

Field1 = "bbb"
Field2 = 123
Field3 = "ddd"

Field1 = "eee"
Field2 = 123
Field3 = "ccc"

我需要像这样过滤这个列表:

  • 我必须获取所有唯一出现的对 Field2-Field3。 Field1 的值是不必要的。

在我的示例中,选择的结果必须删除第三个对象,因为 Field2 和 Field3 的值相同。

我已尝试使用 Select-Object -Unique Field2, Field3,但没有过滤任何内容。

我也尝试过Where-Object,结果相同。

有什么想法吗?我使用的是旧版本的 powershell,所以我不能使用一些 cmdlet。

谢谢。

这是代码:它可以工作,但我还需要在输出中获取 Field1

$result = @{}
 foreach($item in $myList) {
       $combined = '{0}-{1}' -f $item.Field2, $item.Field3
       if($result.ContainsKey($combined) -eq $false) {
          $result[$combined] = $item
       }
    }
    $result.Values

【问题讨论】:

  • 我尝试过使用Select-Object -Unique Field2, Field3,但没有过滤任何内容。你能用minimal reproducible example 来证明这一点吗? tio.run
  • 我在您发布的代码中没有看到 $result = @{}
  • 你是对的。现在它可以工作了,但我的输出是: 名称:Field2-Field3 值:all-my-object-field-and-values 如何只选择我需要的字段?

标签: powershell unique select-object


【解决方案1】:

你可以使用表达式:

$objects | Select -Unique @{n='Combined'; e={'{0}-{1}' -f $_.Field2, $_.Field3}}

这是使用哈希的另一种方式:

$result = @{}
foreach($item in $objects){
    $combined = '{0}-{1}' -f $item.Field2, $item.Field3
    if($result.ContainsKey($combined) -eq $false){
        $result[$combined] = $item
    }
}
$result.Values | Select Field1

【讨论】:

  • 我无法理解您的表达,并且似乎不适用于我的代码。我还需要从我的对象列表中选择 Field1
  • ContainsKey 方法不存在。我在这条线上收到了一个错误。
  • 不知道你在做什么。 ContainsKey 肯定是散列上的有效方法。请使用您正在运行的实际代码更新您的问题。
  • @maures 编辑为仅获取 Field1 值
猜你喜欢
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 2017-05-04
相关资源
最近更新 更多