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