Допустим, у меня есть ряд объектов (в pscustomObject или Hashtables), и мне нужно динамически ссылаться на них, поскольку именно пользователь решает, к каким данным обращаться.
....
$sweden = [PSCustomObject]@{monday = "sunny" ; tuesday = "sunny" ; wednesday = "sunny" ; thursday = "sunny" ; friday = "sunny"}
$siberia = [PSCustomObject]@{monday = "cold" ; tuesday = "cold" ; wednesday = "cold" ; thursday = "cold" ; friday = "cold"}
$turkey = [PSCustomObject]@{monday = "unknown" ; tuesday = "unknown" ; wednesday = "cold" ; thursday = "cold" ; friday = "cold"}
$england = [PSCustomObject]@{monday = "miserable" ; tuesday = "miserable" ; wednesday = "miserable" ; thursday = "miserable" ; friday = "miserable"}
....
Пользователь должен передать свое значение переменной $country
, затем мне нужно получить доступ к соответствующему пулу данных. Что-то вроде следующего:
$country = 'england'
$("$country").monday #this should print "miserable"
Запуская вышеописанное, ничего не происходит, никаких ошибок. Приглашение возвращается, вот и все. Я тоже пробовал без кавычек, $($country).monday
.
пвш 7.4/win11
То, что вам нужно, — это косвенное обращение к переменной, когда вы ссылаетесь на переменную косвенно, через ее имя, хранящееся в другой переменной или предоставленное выражением. PowerShell позволяет это сделать с помощью командлетов Get-Variable и Set-Variable, но учтите, что обычно существуют лучшие альтернативы, такие как хеш-таблицы, как показано в ответе Сантьяго.
Вы можете использовать Get-Variable
для получения именованной переменной из строки, например $variable_name = "sweden"; $dynamic_value = (Get-Variable -Name $variable_name).Value
но такого рода метапрограммирование/рефлексия в конечном итоге завяжет вас узлами. Ответ @SantiagoSquarzon ниже - лучший вариант...
Используйте одну хеш-таблицу вместо нескольких переменных для ссылки на ваши страны:
$countries = @{
sweden = [PSCustomObject]@{monday = 'sunny' ; tuesday = 'sunny' ; wednesday = 'sunny' ; thursday = 'sunny' ; friday = 'sunny' }
siberia = [PSCustomObject]@{monday = 'cold' ; tuesday = 'cold' ; wednesday = 'cold' ; thursday = 'cold' ; friday = 'cold' }
turkey = [PSCustomObject]@{monday = 'unknown' ; tuesday = 'unknown' ; wednesday = 'cold' ; thursday = 'cold' ; friday = 'cold' }
england = [PSCustomObject]@{monday = 'miserable' ; tuesday = 'miserable' ; wednesday = 'miserable' ; thursday = 'miserable' ; friday = 'miserable' }
}
$country = 'england'
$countries[$country].monday # this should print "miserable"
Альтернативой при использовании нескольких переменных для динамической ссылки на него является использование Get-Variable
, что действительно неприятно:
$country = 'england'
(Get-Variable $country -ValueOnly).monday
это то, что вы можете легко решить, используя хеш-таблицу,
$countries['england'].monday
или, вводя пользователя,$countries[$country].monday