首页 > 解决方案 > 如何将冒号分隔的字符串存储在哈希表中?

问题描述

我有一个脚本可以从另一个脚本作为 JSON 获得响应,

$resp = & ".\script1.ps1" | ConvertFrom-Json

$resp[1] 

我得到以下输出:

abc    :  1234
defghjk:  897
klm    :  something12

现在我想将它们作为键/值存储在哈希表中

$hash = @{}

$($resp[1]) | ForEach-Object {
    # Split each pair into key and value
    $key,$value = $_.Split(':')
    # Populate $hash
    $hash[$key] = $value
}

return $hash

我收到以下错误:

方法调用失败,因为 [System.Management.Automation.PSCustomObject] 不包含名为“Split”的方法

索引操作失败;数组索引评估为 null。在 $hash[$key] = $value


更新:有了这个我可以输出键、值和名称

$resp[1].PSObject.Properties | Foreach { $hash[$_.Key] = $_.Value }

return $hash

我回来了:

Key : abc
Value : 1234
Name: abc

Key : defghjk
Value : 897
Name: defghjk

等等...

假设我有一个如下的 SQL 表

桌子

我有以下查询来获取 ID:

$DB_ID = Query "select ID from table where DB = 'cube1'" | Select -ExpandProperty ID;

如何根据$DB_ID与键/名称的匹配获取值并将值存储在变量中$password

换句话说,我正在寻找这样的东西:

$password = $hash.value where $hash.key -match `$DB_ID`

那么这种情况下的密码(cube1)将是:1234,因为密钥 abc 将匹配表中的 abc


UPDATE2:现在我想起来了,我可能甚至不需要对响应进行哈希处理。也许我可以做这样的事情,对吧?:

$password = $resp[1].PSObject.Properties.value where $resp[1].PSObject.Properties.key -match $DB_ID

标签: powershell

解决方案


APSCustomObject基本上已经是键和值,它是一个适当的对象 - 它只:是以一种友好的方式输出,以向您显示信息。左边:是键,右边是值。但是,如果您希望它成为正确的哈希表,则必须像这样遍历属性:

$myHash = @{}
$resp[1].PSObject.Properties | Foreach { $myHash[$_.Name] = $_.Value }

它的工作方式是PSCustomObject具有一个PSObject属性,您可以从中获取属性。遍历 上的每个属性PSCustomObject,并将属性名称设置为 中的键$myHash,并将相同属性的值设置为 中该键的值$myHash

更新响应

您将访问如下内容:$myHash['cube1']$myHash['cube2'].

如果您已经$DB_ID提前知道目标,并且从该脚本返回的所需对象已经将数据库组织到一个 ID,您可以这样做$myHash[$DB_ID]

实际上,您甚至不需要将其转换为哈希表即可。您可以简单地使用PSCustomObject从 JSON 转换而来的原始文件,如下所示:

$resp[1].$DB_ID或者$resp[1]."$DB_ID"


推荐阅读