Переменные в команде при вызове hashtable - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь получить значение из хеш-таблицы, как показано ниже.

$Hashtable1AuthTestID = @{ 
    "BID_XPI" = "(id 2)";
    "MBID_XPI" = "(id 3)";
    "T_XPI" = "(id 4)";
    "ST_XPI" = "(id 5)";
    "SI_XPI" = "(id 6)";
    "T_SAML" = "(id 7)";
    "ST_SAML" = "(id 8)";
    "SI_SAML" = "(id 9)";
    "BID_SAML" = "(id 10)";
    "MBID_SAML" = "(id 11)";
}

Это нормально работает, если я использую $Hashtable1AuthTestID.BID_XPI, но так как это будет общий сценарий для нескольких различных типов данных (и сред), я хотел бы включить несколько переменных, когда я вызываю хеш-таблицу, такую ​​как приведенная ниже.

# Without variables (Example): $Hashtable1AuthTestID.BID_XPI 
# With variables (Example): $<Hashtable><Type><Environment>.<Method>

$hashtable = "Hashtable1"
$type = "Auth"
$environment = "Test"
$method = "BID_XPI"
# ID is the example is a string.

$'$hashtable1'$environment"ID".$method
$$hashtable1$environment+"ID".$method

Я протестировал несколько разных подходов, но не могу заставить его работать. Я получаю правильный синтаксис (если я печатаю значения из переменных), например $Hashtable1AuthTestID.BID_XPI, но я не получаю фактическое значение из хеш-таблицы ((id 2)).

Ответы [ 3 ]

1 голос
/ 17 июня 2019

Ссылка на индивидуально именованные переменные с использованием имени из другой переменной - хотя это и возможно - ошибочный подход. Не делай этого. Канонический способ справиться с подобными ситуациями - использовать массив, если вы хотите получить доступ к структуре данных или объекту по индексу:

$hashtables = @()
$hashtables += @{
    "BID_XPI"  = "(id 2)"
    "MBID_XPI" = "(id 3)"
    ...
}

$hashtables[0].MBID_XPI

или хеш-таблицу, если вы хотите получить доступ к структуре данных или объекту по имени:

$hashtables = @{}
$hashtables['Hashtable1AuthTestID'] = @{
    "BID_XPI"  = "(id 2)"
    "MBID_XPI" = "(id 3)"
    ...
}

$hashtable   = 'Hashtable1'
$type        = 'Auth'
$environment = 'Test'
$method      = 'BID_XPI'

$name = "${hashtable}${type}${environment}ID"

$hashtables.$name.$method

Ради полноты, вот как вы можете получить переменную, используя имя из другой переменной, но, опять же, это НЕ РЕКОМЕНДУЕТСЯ.

$Hashtable1AuthTestID = @{
    "BID_XPI"  = "(id 2)"
    "MBID_XPI" = "(id 3)"
    ...
}

$hashtable   = 'Hashtable1'
$type        = 'Auth'
$environment = 'Test'
$method      = 'BID_XPI'

$name = "${hashtable}${type}${environment}ID"

(Get-Variable -Name $name -ValueOnly).$method
0 голосов
/ 17 июня 2019

Если вы можете распечатать его, вы можете вызвать его:

$string = '${0}{1}{2}ID.{3}' -f $hashtable,$type,$environment,$method
Invoke-Expression -Command $string
0 голосов
/ 17 июня 2019

Вы можете использовать Get-Variable:

$hashtable = "Hashtable1"
$type = "Auth"
$environment = "Test"
$method = "BID_XPI"

(Get-Variable -Name "$($hashtable)$($type)$($environment)ID".).Value.$method
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...