Powershell5 IndexOf行为发生了变化 - 建议?

时间:2016-04-14 09:33:15

标签: powershell indexof powershell-v4.0 powershell-v5.0

最近我的工作站已升级到Windows10我一直在检查我所有的旧脚本,看起来IndexOf的行为方式不同。

在PS4中,这很好用:

    $fullarray = $permissions | %{
    $obj = new-object psobject
    $obj | add-member -name Group -type noteproperty -value $_.Account.AccountName
    $obj | add-member -name Access -type noteproperty -value $_.AccessRights
    $obj
}   
$array = {$fullarray}.Invoke()
# Convert array to list from which we can remove items
$arraylist = [System.Collections.ArrayList]$array
# Remove admin groups/users
$ExcludeList | % {
    $index = ($arraylist.group).IndexOf($_)
    If ($index -gt -1) {
        $arraylist.RemoveAt($index) | Out-Null
    }
}

但是在PS5中,IndexOf只返回所有值的-1。我根本找不到让它与arraylists一起工作的方法 - 为了让它在PS5中工作,我现在有了这个kludge修复:

    $array = {$fullarray}.Invoke()
# Convert array to list from which we can remove items
$arraylist = [Collections.Generic.List[Object]]($array)
# Remove admin groups/users
ForEach ($HideGroup in $ExcludeList) {
    $index = $arraylist.FindIndex( {$args[0].Group -eq $HideGroup} )
    If ($index -gt -1) {
        $arraylist.RemoveAt($index) # | Out-Null
    }
}

任何关于为什么会发生变化的想法,如果你有更好的解决方案,我将非常感激!

1 个答案:

答案 0 :(得分:1)

我不知道为什么你会看到ArrayList.IndexOf()的不同行为的答案,但我建议使用Where-Object而不是你正在做的事情:

$fullarray = $permissions | ForEach-Object {
    $obj = new-object psobject
    $obj | add-member -name Group -type noteproperty -value $_.Account.AccountName
    $obj | add-member -name Access -type noteproperty -value $_.AccessRights
    $obj
} 
$filteredarray = $fullarray | Where-Object { $Excludelist -notcontains $_.Group }