Полезный ответ AdminOfThings показывает один подход к предоставлению доступа к значениям на основе ключей: [pscustomobject]
.
В общих чертах вы ищетедля словаря или хеш-таблицы (хеш-таблица): набор пар ключ-значение, которые обеспечивают эффективный поиск значения по связанному ключу.
Фактически, метод [pscustomobject]
в связанном ответе синтаксически основан на синтаксисе хэш-таблицы PowerShell , @{ <key> = <value>; ... }
[1] .
Примердля краткости используйте блок скрипта ({ ... }
) вместо скрипта / функции:
$output = & {
# Output a hashtable
@{ x = 'one'; y = 'two' }
}
# Access the entries by key:
# Index syntax:
$output['x'] # -> 'one'
$output['y'] # -> 'two'
# Dot notation, as with objects, works too.
# While this is convenient, it is much slower with variable-based keys;
# e.g., $output.$keyName - this typically won't matter, but may in loops
# with a high number of iterations.
$output.x # -> 'one'
$output.y # -> 'two'
Если порядок, в котором перечисляются записи, имеет значение, используйте упорядоченную хеш-таблицу (PSv3 +): [ordered] @{ <key> = <value>; ... }
.
Вы платите только незначительное снижение производительности за использование упорядоченной хеш-таблицы, поэтому я предлагаю использовать [ordered]
по привычке, так как это обеспечивает более приятный вывод и отладкучтобы увидеть записи в том же порядке, в котором они были определены.
Выбор между [pscustomobject]
и хеш-таблицей:
Если вы представляете выход как один объект со значениями, хранящимися вСвойства, используйте [pscustomobject]
, но обратите внимание, что создание объекта медленнее, чем создание хеш-таблицы.
Если выходные данные являются просто набором пар ключ-значение, используйте (n упорядоченный) hashtable.
Если производительность имеет значение (в циклах с большим количеством итераций):
Использование (заказано) hashtables .
Использовать индексный доступ с не-литеральными ключами (например, $key = 'one'; $ht[$key]
), что намного быстрее, чем запись с не-литеральными точками(например, $key = 'one'; $ht.$key
)
[1] Обратите внимание, однако, что [pscustomobject] @{ ... }
является синтаксическим сахаром в этом пользовательском объекте непосредственно построено - промежуточная хеш-таблица не создается;кроме того, свойства, определяемые ключами хеш-таблицы, определены в порядок определения , тогда как хеш-таблица не гарантирует какого-либо конкретного упорядочения своих записей, если вы не используете [ordered] @{ ... }
.