Как хранить строки, разделенные двоеточиями, в хеш-таблице? - PullRequest
1 голос
/ 14 мая 2019

У меня есть скрипт, который получает ответ от другого скрипта в виде 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»

и

Ошибка операции индексации;индекс массива оценивается как ноль.При $ 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

и у меня есть следующий запрос для получения идентификатора:

$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 Ответ

1 голос
/ 14 мая 2019

A PSCustomObject - это, по сути, уже ключи и значения, это правильный объект - он просто выводит с помощью : как удобный способ отображения информации для вас.Левая сторона : является ключом, а правая сторона - значением.Однако, если вы хотите, чтобы это была правильная хеш-таблица, вам придется выполнить итерацию по свойствам следующим образом:

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

Это работает так, что PSCustomObject имеет свойство PSObject, из которогоВы можете получить свойства от.Выполните итерацию по каждому свойству в PSCustomObject и установите имя свойства в качестве ключа в $myHash, а значение того же свойства, что и значение этого ключа, в $myHash.

UPDATE RESPONSE

Вы получите доступ к следующим: $myHash['cube1'] и $myHash['cube2'].

Если вы уже знаете цель $DB_ID заранее, и требуемый возвращаемый объект из этого сценария уже организуетDB для ID вы можете сделать это: $myHash[$DB_ID].

На самом деле вам даже не нужно конвертировать его в хеш-таблицу, чтобы сделать это.Вы можете просто использовать исходный PSCustomObject, преобразованный из JSON, следующим образом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...