【问题标题】:How to store colon separated strings in hashtable?如何将冒号分隔的字符串存储在哈希表中?
【发布时间】: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


【解决方案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"

【讨论】:

  • 很好,现在当我返回哈希表时,我得到了键、值和名称。我如何访问密钥?例如,假设我有一个表,其中包含与之对应的数据库和 ID。我将有一个查询,该查询将根据我在脚本参数参数中输入的数据库名称检索 ID。我想将 ID 与匹配的相同键(名称)匹配并获取其值。假设我将查询结果存储在一个名为 $DB_ID 的变量中。我如何将密钥与 $DB_ID 进行比较并获取其值并将值设置为 $password?
  • 我不明白,keyvaluename 是原始自定义对象上的属性名称,您在问如何从哈希表中检索这些项目?
  • 同样出于好奇,您为什么要将其转换为哈希表而不是正确使用 PSCustomObject 对象?
  • 检查我帖子中的更新部分,看看我为什么这样做以及我正在尝试做什么
  • 我这样做是否正确:$password = $hash.value where $hash.key -match $DB_ID?或者你是说我不需要为此使用哈希表,我可以直接作为 pscutomobject 访问它? $password = $resp[1].PSObject.Properties.value 其中 $resp[1].PSObject.Properties.key -match $DB_ID
猜你喜欢
  • 2014-01-29
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多