【问题标题】:remove empty keys powershell删除空键powershell
【发布时间】:2016-03-07 14:06:37
【问题描述】:

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

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

【问题讨论】:

    标签: powershell hash key


    【解决方案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($_) } 
    }
    

    【讨论】:

    • 谢谢,这很完美。还能做| ConvertTo-Json 之后。
    【解决方案2】:

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

    $OuHash.GetEnumerator() | ? Value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 2015-11-22
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多