删除空键powershell

jar*_*low 1 powershell hash key

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

foreach ($key in $OUHash.Keys){
    if ($($OUHash.Item($key)) -eq $NULL) {
        $OUHash.Remove($key)
    }
}
Run Code Online (Sandbox Code Playgroud)

这会删除一个空键,但不是全部,它还给了我以下错误消息:

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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ndl 5

您可以使用该GetEnumerator()方法使用Where-Object(别名?)过滤条目 :

$OuHash.GetEnumerator() | ? Value
Run Code Online (Sandbox Code Playgroud)


ccx*_*ccx 5

虽然 Martin 提供的解决方案确实成功过滤掉了具有空值的项目,但它返回一个 Object 而不是 Hashtable (或 OrderedDictionary 如果您使用[ordered]属性)。

虽然可以通过更改Where-Object(别名?)的条件以仅返回具有空值的项目并将结果对象(因此是括号)传递ForEach-Object函数(别名%)中来从哈希表本身中删除不必要的项目:

($OuHash.GetEnumerator() | ? { -not $_.Value }) | % { $OuHash.Remove($_.Name) }
Run Code Online (Sandbox Code Playgroud)

另一种非常相似的方法是获取数组 Object 中的所有哈希表键并将其通过管道传递给ForEach-Object

@($OuHash.keys) | % { 
    if (-not $OuHash[$_]) { $OuHash.Remove($_) } 
}
Run Code Online (Sandbox Code Playgroud)