【发布时间】:2012-05-19 17:32:18
【问题描述】:
为什么下面的代码返回$null?我正在尝试仅存储唯一值。
$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique
【问题讨论】:
标签: string powershell unique
为什么下面的代码返回$null?我正在尝试仅存储唯一值。
$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique
【问题讨论】:
标签: string powershell unique
简答:
要获取所有唯一路径,您应该将$DailyPathsToDelete 传递到Select-Object 并设置Unique 开关。
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
更长的答案:
1.为什么它不起作用
运行脚本后,$DailyPathsToDelete 等于 $null,因为(在脚本的第二行)$DailyPathsToDelete 绑定到参数 Property。 Select-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\
【讨论】:
你可以试试:
$unique = $DailyPathsToDelete | Get-Unique
【讨论】:
使用 Get-Unique,陷阱 - Get-Unique 区分大小写,您还必须先对列表进行排序!
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object | Get-Unique
使用选择对象
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
使用排序对象
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique
【讨论】:
"temp","Temp" | select -unique 返回两项,而不是一项。
"abc", "Abc", "def", "abc" | sort -Case | Get-Unique -- 有和没有它,你会得到不同的结果!