使用GetEnumerator过滤Hashtable始终返回一个对象[]而不是Hashtable:
int
这个问题有一个很好的解决方案吗?
非常感谢任何帮助! 亲切的问候, 汤姆
答案 0 :(得分:4)
$filtered
是一个字典条目数组。据我所知,目前还没有单一演员或演员。
您可以构建哈希:
$hash = @{}
$filtered | ForEach-Object { $hash.Add($_.Key, $_.Value) }
另一个工作流程:
# Init Hashtable
$items = @{ a1 = 1; a2 = 2; b1 = 3; b2 = 4}
# Copy keys to an array to avoid enumerating them directly on the hashtable
$keys = @($items.Keys)
# Remove elements not matching the expected pattern
$keys | ForEach-Object {
if ($_ -notmatch "a.*") {
$items.Remove($_)
}
}
# $items is filtered
答案 1 :(得分:2)
这是一个更简单的功能,甚至具有包含和排除功能
function Select-HashTable {
[CmdletBinding()]
param (
[Parameter(Mandatory,ValueFromPipeline)][Hashtable]$Hashtable,
[String[]]$Include = ($HashTable.Keys),
[String[]]$Exclude
)
if (-not $Include) {$Include = $HashTable.Keys}
$filteredHashTable = @{}
$HashTable.keys.where{
$PSItem -in $Include
}.where{
$PSItem -notin $Exclude
}.foreach{
$filteredHashTable[$PSItem] = $HashTable[$PSItem]
}
return $FilteredHashTable
}
示例:
$testHashtable = @{a=1;b=2;c=3;d=4}
$testHashTable | Select-HashTable -Include a
Name Value
---- -----
a 1
$testHashTable | Select-HashTable -Exclude b
Name Value
---- -----
c 3
d 4
a 1
$testHashTable | Select-HashTable -Include a,b,c -Exclude b
Name Value
---- -----
a 1
c 3
答案 2 :(得分:1)
由于accepted answer导致我BadEnumeration
例外(但仍有效),我将其修改为不抛出异常并确保原始HashTable
不是通过首先克隆它来修改:
# Init Hashtable
$items = @{ a1 = 1; a2 = 2; b1 = 3; b2 = 4}
$filtered = $items.Clone()
$items.Keys | ForEach-Object {
if ($_ -notmatch "a.*") {
$filtered.Remove($_)
}
}
答案 3 :(得分:0)
在现代的PowerShell
(据我所记得,5
+)上,您可以使用reduce
模式。为此,您需要使用以下形式的ForEach-Object
:
$Hashtable.Keys | ForEach-Object {$FilteredHashtable = @{}} {
if ($_ -eq 'Example') {
$FilteredHashtable[$_] = $Hashtable[$_];
}
} {$FilteredHashtable}
是的,此代码段将返回Hashtable
。