使用GetEnumerator过滤Hashtable总是返回一个object[]而不是Hashtable:
# Init Hashtable
$items = @{ a1 = 1; a2 = 2; b1 = 3; b2 = 4}
# apply a filter
$filtered = $items.GetEnumerator() | ?{ $_.Key -match "a.*" }
# The result looks great
$filtered
Name Value
---- -----
a2 2
a1 1
# … but it is not a Hashtable :-(
$filtered.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
有没有一个很好的解决这个问题的办法?
非常感谢您的帮助!,亲切的问候,汤姆
4条答案
按热度按时间u7up0aaq1#
$filtered
是一个字典条目数组。据我所知,没有单类型转换或ctor。你可以创建一个hash:
另一个工作流程:
4sup72z82#
这里有一个更简单的函数,它甚至有包含和排除功能
示例:
$testHashtable = @{a=1;b=2;c=3;d=4}
x一个一个一个一个x一个一个二个一个x一个一个三个一个
x4shl7ld3#
由于accepted answer导致了
BadEnumeration
异常(但仍然有效),我修改了它,使其不会抛出异常,并确保原始的HashTable
不会通过先克隆它而被修改:odopli944#
在一个现代的
PowerShell
(5
+据我所知),你可以使用reduce
模式。为此,你需要使用这种形式的ForEach-Object
:是的,此代码段将返回
Hashtable
。