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

res*_*101 2 string powershell unique

为什么以下代码会返回$null?我试图存储唯一的值.

$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique 
Run Code Online (Sandbox Code Playgroud)

jon*_*n Z 9

简短回答:

为了让所有的唯一路径,您应该管$DailyPathsToDeleteSelect-Object并设置Unique开关.

$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
Run Code Online (Sandbox Code Playgroud)

更长的回答:

1.为什么它不起作用

运行脚本后$DailyPathsToDelete等于$null因为(在脚本的第二行)$DailyPathsToDelete绑定参数Property.该参数InputObject的的Select-Objectcmdlet的是不是speficified,这就是为什么在调用的结果Select-Object$null.

通过跟踪表达式可以轻松验证这一点:

Trace-Command -psHost -Name ParameterBinding { Select-Object $DailyPathsToDelete -Unique}
Run Code Online (Sandbox Code Playgroud)

得到:

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
Run Code Online (Sandbox Code Playgroud)

2.如何解决它

使用Select-Object

$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
Run Code Online (Sandbox Code Playgroud)

使用Sort-Object

$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique
Run Code Online (Sandbox Code Playgroud)

3.如何解决它

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

例:

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


JPB*_*anc 5

你可以试试 :

$unique = $DailyPathsToDelete | Get-Unique
Run Code Online (Sandbox Code Playgroud)


Sha*_*evy 5

  1. 使用 Get-Unique,有一个问题 - Get-Unique 区分大小写,并且您还必须首先对列表进行排序!

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

  2. 使用选择对象

    $DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique

  3. 带排序对象

    $DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique