Powershell 无法将对象转换为哈希表

Powershell 无法将对象转换为哈希表,powershell,Powershell,我有一个如下所示的哈希表: $hashtable = @{ "fruit" = "apple" "vegetable" = "carrot" "foo" = "bar" "test01" = "test" "test02" = "test" "test03" = "test" "test04" = "test" } 现在我想删除像“Test”这样的条目,并创建一个新的哈希表: [hashtable]$newHashTable = $has

我有一个如下所示的哈希表:

$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*"}
$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)}  
这返回错误:
无法将类型为“System.Object[]”的“System.Object[]”值转换为类型为“System.Collections.Hashtable”。


如何从过滤后的输出中创建新的哈希表?

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

$newhashtable = @{}
$hashtable.GetEnumerator() | Where-Object {$_.Name -notlike "test*"} | ForEach-Object { $newhashtable[$_.name] = $_.value }
您可以看到,
$newhashtable
被保留为hasttable:

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

您可以使用
Remove
方法获得要从哈希表中删除的键的列表:

[hashtable]$newHashTable = $hashtable.GetEnumerator() | `
Where-Object {$_.Name -notlike "test*"}
$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
对象也会被修改一样