String 如何在PowerShell中从此数组中获取唯一值?
为什么下面的代码返回String 如何在PowerShell中从此数组中获取唯一值?,string,powershell,unique,String,Powershell,Unique,为什么下面的代码返回$null?我试图只存储唯一的值 $DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\") $DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique 您可以尝试: $unique = $DailyPathsToDelete | Get-Unique 使用Get-Unique,gotcha-Get-Unique是区分大小写的,您
$null
?我试图只存储唯一的值
$DailyPathsToDelete = @("C:\temp\IMG000483\","C:\temp\IMG000483\")
$DailyPathsToDelete = Select-Object $DailyPathsToDelete -Unique
您可以尝试:
$unique = $DailyPathsToDelete | Get-Unique
$DailyPathsToDelete=$DailyPathsToDelete |排序对象|获取唯一性
$DailyPathsToDelete=$DailyPathsToDelete |选择对象-唯一
$DailyPathsToDelete=$DailyPathsToDelete |排序对象-唯一
简短回答: 要获取所有唯一路径,您应该将
$DailyPathsToDelete
输送到选择对象
,并设置唯一
开关
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
更长的回答:
1。为什么它不起作用
运行脚本后,$DailyPathsToDelete
等于$null
,因为(在脚本的第二行中)$DailyPathsToDelete
绑定到参数属性
。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。如何修复它
使用选择对象
:
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
$DailyPathsToDelete = $DailyPathsToDelete | Sort-Object -Unique
使用排序对象:
$DailyPathsToDelete = $DailyPathsToDelete | Select-Object -Unique
$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\
实际上,“选择对象”也区分大小写。示例:
“temp”、“temp”| select-unique
返回两个项目,而不是一个。此外,使用Get unique时,必须使用-Case敏感参数对对象进行排序:尝试此--“abc”、“abc”、“def”、“abc”| Sort-Case | Get unique
--有和没有它,您会得到不同的结果@索伦斯小姐,你完全正确。有趣的是,我在2011年向PowerShell团队报告了这种行为,现在它被添加到帮助主题中。