我正在尝试使用以下代码删除哈希中所有空的键:
foreach ($key in $OUHash.Keys){
if ($($OUHash.Item($key)) -eq $NULL) {
$OUHash.Remove($key)
}
}
这会删除一个空键,但不是全部,它还会给我这个错误消息:
Collection was modified; enumeration operation may not execute.
At C:\AD\Shadow group Sync.ps1:31 char:10
+ foreach ($key in $Hash.Keys){
+ ~~~~
+ CategoryInfo : OperationStopped: (:) [], InvalidOperationException
+ FullyQualifiedErrorId : System.InvalidOperationException
答案 0 :(得分:4)
您可以使用GetEnumerator()
方法使用Where-Object(别名?
)过滤条目:
$OuHash.GetEnumerator() | ? Value
答案 1 :(得分:1)
尽管Martin提供的解决方案确实成功过滤出了具有空值的项目,但它返回的是Object而不是Hashtable(如果使用[ordered]
属性,则返回OrderedDictionary)。
尽管有可能通过更改 Where-Object (别名?
)的条件以仅返回具有空值的项目并将结果用管道传递到哈希表本身,从而从哈希表中删除不必要的项目对象(因此在括号中)放入 ForEach-Object 函数(别名%
):
($OuHash.GetEnumerator() | ? { -not $_.Value }) | % { $OuHash.Remove($_.Name) }
另一种非常相似的方法是获取数组Object中的所有哈希表键,并将其通过管道传输到 ForEach-Object :
@($OuHash.keys) | % {
if (-not $OuHash[$_]) { $OuHash.Remove($_) }
}