【问题标题】:How to remove duplicate entry sorted on property name, with latest date如何删除按属性名称排序的重复条目,最新日期
【发布时间】:2019-12-10 01:31:16
【问题描述】:

我正在尝试从变量中删除重复条目,但没有任何运气

我尝试使用 -Unique,但不知道如何缩小范围以不过滤掉具有最新源日期的条目

结果是:

我想根据名称过滤掉所有重复项,但按来源日期排序

Get-CMPackage -Fast | Where-Object {$_.Manufacturer -like "Lenovo"  -and $_.Name -like "*Drivers*"}  | 
Sort-Object -Property SourceDate -Unique | Select-Object PackageID,Name,SourceDate

【问题讨论】:

  • 如果你Sort-Object -Property SourceDate -Descending -Unique会发生什么?

标签: powershell sorting duplicates


【解决方案1】:

你可以做一个双重排序。

Get-CMPackage -Fast |
    Where-Object {$_.Manufacturer -like "Lenovo"  -and $_.Name -like "*Drivers*"} | 
       Sort-Object -Property Name -Unique | 
          Sort-Object -Property SourceDate | 
              Select-Object PackageID,Name,SourceDate

Group-Object也可以使用。

Get-CMPackage -Fast |
    Where-Object {$_.Manufacturer -like "Lenovo"  -and $_.Name -like "*Drivers*"} | 
       Group-Object -Property Name | 
           Select-Object @{n='PackageID';e={$_.group.PackageID}},
                         Name,
                         @{n='SourceDate';e={($_.group.SourceDate | Sort-Object)[0]}}

【讨论】:

  • 你好,这个过滤掉了T460s包的最新日期(07-07-2019),我想把它倒过来,怎么存档?
  • 这是有效的:Get-CMPackage -Fast | Where-Object {$_.Manufacturer -like "Lenovo" -and $_.Name -like "*Drivers*"} | Sort-Object -Property SourceDate -Descending | Sort-Object -Property Name -Unique | Select-Object PackageID,Name,SourceDate 感谢您为我指明正确的方向
【解决方案2】:

我忘记了我是从哪里得到这个的——这对你的目的来说可能有点过头了——但是把它贴在这里以防你/其他人觉得它有用。

此函数仅根据属性选择项目,其中每个属性成员都是唯一的。

function Select-Unique
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory=$true, Position=0)]
        [string[]] $Property,

        [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
        $InputObject,

        [Parameter()]
        [switch] $AsHashtable,

        [Parameter()]
        [switch] $NoElement
    )

    begin
    {
        $Keys = @{}
    }

    process
    {
        $InputObject | foreach-object {

            $o = $_
            $k = $Property | foreach-object -begin {
                    $s = ''
                } -process {
                    # Delimit multiple properties like group-object does.
                    if ( $s.Length -gt 0 )
                    {
                        $s += ', '
                    }

                    $s += $o.$_ -as [string]
                } -end {
                    $s
                }

            if ( -not $Keys.ContainsKey($k) )
            {
                $Keys.Add($k, $null)
                if ( -not $AsHashtable )
                {
                    $o
                }
                elseif ( -not $NoElement )
                {
                    $Keys[$k] = $o
                }
            }
        }
    }

    end
    {
        if ( $AsHashtable )
        {
            $Keys
        }
    }
}

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2020-09-02
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多