Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何在PowerShell中从此数组中获取唯一值?_String_Powershell_Unique - Fatal编程技术网

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
  • 使用Get-Unique,gotcha-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团队报告了这种行为,现在它被添加到帮助主题中。