在ConvertFrom-StringData hash

时间:2016-11-25 18:05:07

标签: powershell hash

我有一个哈希表,我从一个文件,使用的命令:

[array]$hash= Get-Content -raw '../../file.txt' | ConvertFrom-StringData

file.txt如下所示:

key=value

完美无缺,问题出在我尝试使用$hash.GetEnumerator进行搜索时。

我正在尝试做这样的事情:

$hash.GetEnumerator() | where {$_.value -match 'value'}  // or with key

它总是返回一个空值。从link得到它,尝试使用$hash=@{}然后add创建本地哈希,并且它起作用(就像链接中的人一样)。

请注意! $hash.GetEnumerator() | Sort-Object Name也适合我,并返回正确的桌子。

您是否知道如何在我创建的哈希表中搜索(-eq或-match)?

2 个答案:

答案 0 :(得分:0)

试试这个

$hash.GetEnumerator() | where {$($_.Value) -match 'value'}

或者像这样

$hash.Keys  | % {$($hash[$_]) -eq 'value'} | %{$hash[$_]}

或更好,您可以将哈希表转换为对象列表

$hash.GetEnumerator()  | 
    % {New-Object psobject -Property @{Name=$($_.Name); Value=$($_.Value)} } | 
         where Value -match 'value'

答案 1 :(得分:0)

您对我的评论要求澄清的回复没有说明太多,但我会假设您想要在哈希表中找到特定键的值。这种查找是hashtables的核心功能。

$ht = @'
foo=23
bar=42
baz=5
'@ | ConvertFrom-StringData

$key = 'bar'
$ht[$key]  # returns 42

如果您确实希望在键上进行模糊匹配,则可以使用wildcard匹配替换直接查找,如下所示:

$partialKey = 'ba*'
$ht.Keys | Where-Object {
  $_ -like $partialKey
} | ForEach-Object {
  $ht[$_]  # returns 42 and 5
}

regular expression匹配如下:

$partialKey = '^ba'
$ht.Keys | Where-Object {
  $_ -match $partialKey
} | ForEach-Object {
  $ht[$_]  # returns 42 and 5
}

作为在循环中查找多个键的替代方法,您还可以构建一个键列表并在单个查找中使用该列表:

$partialKey = 'ba*'
$keys = $ht.Keys | Where-Object { $_ -like $partialKey }
$ht[$keys]  # returns 42 and 5