为什么下面的代码返回$null
?我试图存储唯一的值。如何从PowerShell中的此数组获取唯一值?
$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique
为什么下面的代码返回$null
?我试图存储唯一的值。如何从PowerShell中的此数组获取唯一值?
$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique
你可以试试:
$unique = $DailyPathsToDelete | Get-Unique
用GET-独特,疑难杂症 - 获取唯一是区分大小写的,你也必须先排序列表!
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object | Get-Unique
有Select-对象
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
随着排序,对象
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique
简短回答:
要获取所有唯一路径,您应将管道$DailyPathsToDelete
设置为Select-Object
并设置Unique
开关。
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
较长的答案:
1.为什么它不工作
运行脚本$DailyPathsToDelete
后等于$null
,因为(在脚本的第二行)$DailyPathsToDelete
为界到参数Property
。 Select-Object
cmdlet的参数InputObject
为未加speficified,这就是为什么调用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.如何修复
使用选择,对象
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
使用排序,对象
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique
3。如何不修复
我建议不要因为Windows本地文件系统(NTFS,FAT和变体)在方案中使用Get-Unique
不区分大小写。
实施例:
$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\Temp\IMG000483\")
PS C:\> $DailyPathsToDelete | get-unique
C:\temp\IMG000483\
C:\Temp\IMG000483\
实际上,选择-Object也是区分大小写。例如:''temp“,”Temp“|选择-unique'返回两个项目,而不是一个。 –
此外,使用Get-Unique必须使用-CaseSensitive参数来排序对象:试试这个 - “”abc“,”abc“,”def“,”abc“|排序-Case |获取 - 独特 - - 有没有它,你会得到不同的结果! –
@msorens你是对的。有趣的是,我实际上在2011年向PowerShell团队报告了这种行为,现在它已添加到帮助主题中。 –