如何在PowerShell中从此数组获取唯一值?

6
为什么下面的代码返回 $null?我试图只存储唯一值。
$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique 
3个回答

14

简短回答:

要获取所有唯一的路径,您应该将$DailyPathsToDelete输入管道并设置Select-ObjectUnique开关。

$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique

较长的答案:

1. 为什么它不能工作

运行您的脚本后,$DailyPathsToDelete 等于 $null,因为(在您的脚本的第二行中)$DailyPathsToDelete 绑定到参数 PropertySelect-Object 命令的参数 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\

5

您可以尝试:

$unique = $DailyPathsToDelete | Get-Unique

5
  1. 使用Get-Unique命令时需要注意 - Get-Unique会区分大小写,您还需要对列表进行排序!

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

  2. 使用Select-Object命令时

    $DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique

  3. 使用Sort-Object命令时

    $DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique


实际上,Select-Object 也是区分大小写的。例如:"temp","Temp" | select -unique 返回两个项目,而不是一个。 - Michael Sorens
1
另外,使用Get-Unique时必须使用-CaseSensitive参数来对Sort-Object进行排序:尝试一下--“abc”,“Abc”,“def”,“abc” | sort -Case | Get-Unique--有和没有它会得到不同的结果! - Michael Sorens
1
@msorens 你说得完全正确。有趣的是,我在2011年向PowerShell团队报告了这种行为,现在它已经被添加到帮助主题中了。 - Shay Levy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接