6

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

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

3 回答 3

12

简短的回答:

要获得所有唯一路径,您应该通过管道$DailyPathsToDelete连接Select-Object并设置Unique开关。

$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique

更长的答案:

1. 为什么它不起作用

运行脚本后$DailyPathsToDelete等于$null因为(在脚本的第二行中)$DailyPathsToDelete绑定到参数Property没有指定cmdlet的参数InputObject,这就是调用的结果 is 的原因。Select-ObjectSelect-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\
于 2012-05-20T16:32:06.443 回答
5

你可以试试 :

$unique = $DailyPathsToDelete | Get-Unique
于 2012-05-19T17:37:22.427 回答
4
  1. 使用 Get-Unique,gotcha - Get-Unique 区分大小写,您还必须先对列表进行排序!

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

  2. 使用选择对象

    $DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique

  3. 使用排序对象

    $DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique

于 2012-05-20T06:26:57.013 回答