Powershell:过滤Hashtable - 并获得Hastable

时间:2016-03-03 21:18:11

标签: powershell hashtable

使用GetEnumerator过滤Hashtable始终返回一个对象[]而不是Hashtable:

int

这个问题有一个很好的解决方案吗?

非常感谢任何帮助! 亲切的问候, 汤姆

4 个答案:

答案 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