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 で動作させるには、次のような修正が必要です。

    $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
    }
}

これが変更された理由についてのアイデア、およびより良い修正があれば大歓迎です!

4

1 に答える 1

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 }
于 2016-04-14T09:49:25.033 に答える