2016-04-14 3 views
0

Недавно обновив мою рабочую станцию ​​до Windows10, я проверял все мои старые сценарии, и, похоже, IndexOf ведет себя по-другому.Powershell5 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 теперь у меня есть этот ляп исправление:

$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

Я не знаю ответа на вопрос, почему вы видите различные модели поведения с 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 } 
+0

Хорошо крика. Скрипт был вовремя эволюционирует, и я думаю, что я изначально был изменен на ArrayList, так как я также хотел удалить на основе других критериев (например, если пользователь уже был участником) и добавить элемент, как только я удалил ненужные группы , но я вижу, что все же проще использовать этот метод. Спасибо – Scepticalist

+0

Вы можете сделать это с помощью 'Where-Object', а также –

Смежные вопросы