【问题标题】:How do I get unique values from this array in PowerShell?如何在 PowerShell 中从此数组中获取唯一值?
【发布时间】:2012-05-19 17:32:18
【问题描述】:

为什么下面的代码返回$null?我正在尝试仅存储唯一值。

$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique 

【问题讨论】:

    标签: string powershell unique


    【解决方案1】:

    简答:

    要获取所有唯一路径,您应该将$DailyPathsToDelete 传递到Select-Object 并设置Unique 开关。

    $DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
    

    更长的答案:

    1.为什么它不起作用

    运行脚本后,$DailyPathsToDelete 等于 $null,因为(在脚本的第二行)$DailyPathsToDelete 绑定到参数 PropertySelect-Object cmdlet 的参数InputObject 未指定,这就是为什么调用Select-Object 的结果是$null

    这可以通过追踪你的表情很容易地验证:

    Trace-Command -psHost -Name ParameterBinding { Select-Object $DailyPathsToDelete -Unique}
    

    给予:

    DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Select-Object]
    DEBUG: ParameterBinding Information: 0 :     BIND arg [True] to parameter [Unique]
    DEBUG: ParameterBinding Information: 0 :         COERCE arg to     [System.Management.Automation.SwitchParameter]
    DEBUG: ParameterBinding Information: 0 :             Parameter and arg types the same, no coercion is needed.
    DEBUG: ParameterBinding Information: 0 :         BIND arg [True] to param [Unique]     SUCCESSFUL
    DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Select-Object]
    DEBUG: ParameterBinding Information: 0 :     BIND arg [System.Object[]] to parameter [Property]
    DEBUG: ParameterBinding Information: 0 :         BIND arg [System.Object[]] to param [Property] SUCCESSFUL
    DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Select-Object]
    DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
    DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing
    

    2.如何解决它

    使用Select-Object:

    $DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
    

    使用Sort-Object

    $DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique
    

    3.如何不修复它

    我建议不要在您的场景中使用 Get-Unique,因为 Windows 本地文件系统(NTFS、FAT 和变体)不区分大小写。

    例子:

    $DailyPathsToDelete = @("C:\temp\IMG000483\","C:\Temp\IMG000483\")
    PS C:\> $DailyPathsToDelete | get-unique
    C:\temp\IMG000483\
    C:\Temp\IMG000483\
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      $unique = $DailyPathsToDelete | Get-Unique
      

      【讨论】:

        【解决方案3】:
        1. 使用 Get-Unique,陷阱 - Get-Unique 区分大小写,您还必须先对列表进行排序!

          $DailyPathsToDelete = $DailyPathsToDelete | Sort-Object | Get-Unique

        2. 使用选择对象

          $DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique

        3. 使用排序对象

          $DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique

        【讨论】:

        • 其实Select-Object也是区分大小写的。示例:"temp","Temp" | select -unique 返回两项,而不是一项。
        • 另外,使用 Get-Unique 必须使用 -CaseSensitive 参数来排序对象:试试这个 -- "abc", "Abc", "def", "abc" | sort -Case | Get-Unique -- 有和没有它,你会得到不同的结果!
        • @msorens 你说得对。有趣的是,我实际上在 2011 年向 PowerShell 团队报告了这种行为,现在它已添加到帮助主题中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-20
        • 2011-03-02
        • 1970-01-01
        • 2020-09-22
        相关资源
        最近更新 更多