当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 在 PowerShell 中过滤唯一对象

作者:精品下载站 日期:2024-12-14 08:03:30 浏览:12 分类:玩电脑

在 PowerShell 中过滤唯一对象


几周前,我的朋友格拉迪斯·克拉维茨 (Gladys Kravitz) 对与过滤独特对象相关的挑战感到遗憾。 PowerShell 有一个 Get-Unique cmdlet,Select-Object 有一个 -Unique 参数,但这些选项是有限的。一方面,我想说我们使用 PowerShell 管理的大多数事情都保证是唯一的。对象可能具有 GUID、ID 或 SID,以保证唯一性。但是,这就是格拉迪斯的情况,有时我们正在管理的事情来自外部来源。例如从 CSV 文件导入数据。在这种情况下,绝对有可能存在重复的对象。

测试数据

这是一个示例 CSV 源,我将其导入到 PowerShell 中。

$Obj = "Animal,Snack,Color
Horse,Quiche,Chartreuse
Cat,Doritos,Red
Cat,Pringles,Yellow
Dog,Doritos,Yellow
Dog,Doritos,Yellow
Rabbit,Pretzels,Green
Rabbit,Popcorn,Green
Marmoset,Cheeseburgers,Black
Dog,Doritos,White
Dog,Doritos,White
Dog,Doritos,White
" | ConvertFrom-Csv

您可以清楚地看到重复的对象。

[玩转系统] 在 PowerShell 中过滤唯一对象

现有命令

使用 Select-Object 对于这种情况没有任何帮助,即使您觉得您告诉 PowerShell“选择唯一的对象”。

[玩转系统] 在 PowerShell 中过滤唯一对象

这对于单个属性来说效果很好。

[玩转系统] 在 PowerShell 中过滤唯一对象

但这不是目标。然后我将注意力转向 Get-Unique。但这并没有好多少。

[玩转系统] 在 PowerShell 中过滤唯一对象

所以我做了我一直告诉你的事情,我重新阅读了帮助。如果您告诉命令将所有内容都视为字符串,则可以使其发挥作用。

[玩转系统] 在 PowerShell 中过滤唯一对象

如果您正在处理像我的演示对象这样的平面和简单对象,这应该可以完成工作。即使比较是通过字符串进行的,输出也是原始对象。但有一个潜在的问题:比较区分大小写。我还发现,如果对象具有丰富的属性,例如数组或哈希表,则 Get-Unique 并不总是提供预期的结果。

使用比较对象

我决定进入另一个兔子洞并使用 Compare-Object。此 cmdlet 允许您指定要比较的多个属性。

[玩转系统] 在 PowerShell 中过滤唯一对象

对象 3 和 4 是相同的。我的计划是构建一个唯一对象的列表,然后比较每个输入对象。如果该对象尚未在列表中,则将其添加。我首先创建一个列表对象。

 $UniqueList = [System.Collections.Generic.list[object]]::new()

然后对于每个对象,我需要测试它是否存在。 List 对象有一个 Exists() 方法,该方法需要一个谓词,该谓词本质上是一个脚本块。

if ($UniqueList.Exists( { -not (Compare-Object $args[0].psobject.properties.value $item.psobject.Properties.value) })) {
    Write-Debug "[$((Get-Date).TimeofDay) PROCESS] Skipping: $($item |Out-String)"
}
else {
    Write-Debug "[$((Get-Date).TimeofDay) PROCESS] Adding as unique: $($item | Out-String)"
    $UniqueList.add($item)
}

该代码表示:“将列表中的每个对象 $args[0] 与输入对象 $item 进行比较。如果存在匹配,则该对象已在列表中,因此无需执行任何操作。否则,将其添加到列表中。”处理完所有对象后,$UniqueList 应该是唯一的对象。顺便说一句,Compare-Object 不区分大小写。

获取 PSUnique

我将所有这些组合到一个名为 Get-PSUnique 的函数中。

[玩转系统] 在 PowerShell 中过滤唯一对象

在我的测试中,此命令将处理简单的数组和哈希表以进行比较。我想这个限制就是 Compare-Object 在比较属性时所具有的限制。尽管如此,我还是推荐这个函数来处理简单的对象。

想亲自尝试一下吗?我已将此命令添加到最新版本 (2.28.0) 的 PSScriptTools 模块中,您可以从 PowerShell 库安装该模块。或者欢迎您查看 Get-PSUnique 的代码。我希望你会发现这和我认为格拉迪斯一样有用。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯