如何在哈希表中存储冒号分隔的字符串?

时间:2019-05-13 22:26:19

标签: powershell

我有一个脚本,可以从另一个脚本(如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表

table

我有以下查询来获取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

1 个答案:

答案 0 :(得分:1)

PSCustomObject基本上已经是键和值,它是一个适当的对象-它仅与:输出,这是一种向您显示信息的友好方式。 :的左侧是键,右侧是值。如果您希望它成为适当的哈希表,则必须对属性进行迭代,如下所示:

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

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

更新响应

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

如果您已经提前知道目标$DB_ID,并且从该脚本返回的所需对象已经将数据库组织为ID,则可以执行以下操作:$myHash[$DB_ID]

实际上,您甚至都不需要将其转换为哈希表即可。您可以像这样简单地使用从JSON转换的原始PSCustomObject

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