无法将Object转换为Hashtable

3
我有一个像下面这样的哈希表:
$hashtable = @{
    "fruit" = "apple"
    "vegetable" = "carrot"
    "foo" = "bar"
    "test01" = "test"
    "test02" = "test"
    "test03" = "test"
    "test04" = "test"
}

现在我想要删除类似于“Test”这样的条目并创建一个新的哈希表:
[hashtable]$newHashTable = $hashtable.GetEnumerator() | `
Where-Object {$_.Name -notlike "test*"}

出现错误:无法将类型为 "System.Object[]" 的值 "System.Object[]" 转换为类型 "System.Collections.Hashtable"。

如何从筛选输出中创建新的哈希表?

2个回答

5

可能有更聪明的方法,但以下方法可行:

$newhashtable = @{}
$hashtable.GetEnumerator() | Where-Object {$_.Name -notlike "test*"} | ForEach-Object { $newhashtable[$_.name] = $_.value }

您可以看到$newhashtable被保存为Hastable:

PS> $newhashtable.gettype()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Hashtable                                System.Object

3
你可以使用Remove方法,并给出要从哈希表中删除的键列表:
$hashtable = @{
    "fruit" = "apple"
    "vegetable" = "carrot"
    "foo" = "bar"
    "test01" = "test"
    "test02" = "test"
    "test03" = "test"
    "test04" = "test"
}

$newHashtable = $hashtable.Clone()
$RemoveKeys = $newHashtable.keys | Where-Object { $_ -like 'test*' }

ForEach ($Key in $RemoveKeys) { $newHashtable.Remove($Key)}  

请注意,如果您想创建一个副本以进行修改,则需要使用Clone(),而仅使用=会创建一个引用,原始的$hashtable对象也将被修改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接