【发布时间】:2019-05-14 20:06:47
【问题描述】:
我有一个脚本从另一个脚本作为 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] 不包含 名为“拆分”的方法
和
索引操作失败;数组索引评估为 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
【问题讨论】:
-
PScustomobject 是一组名称-值对。它们不是像查询变量时那样用冒号分隔的字符串。从powershellexplained.com尝试这样的
$hashtable = @{} foreach( $property in $myobject.psobject.properties.name ) { $hashtable[$property] = $myObject.$property } -
@Brian 所以我不能将冒号分隔的字符串存储为哈希中的键/值?
-
您可以将其转换为哈希表。但是当您看到它以冒号显示时,它并没有您正在查看的结构。
-
如果您使用 PowerShell 6,您现在可以使用
ConvertFrom-Json -AsHashtable -
@Cataster - 可能不会! [grin] 哈希表 需要 唯一键,并且您的 PSObject 具有每个对象共有的属性。因此,对于 ONE 对象,是的,您可以将道具的哈希表作为键,并将这些道具的值作为这些键的值。
标签: powershell