删除空键powershell

时间:2016-03-07 14:06:38

标签: powershell hash key

我正在尝试使用以下代码删除哈希中所有空的键:

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

2 个答案:

答案 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($_) } 
}