0
votes

Variables dans la commande lors de l'appel de la table de hachage

J'essaie de récupérer une valeur à partir d'une table de hachage comme celle ci-dessous.

# 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

Cela fonctionne bien si j'utilise $ Hashtable1AuthTestID.BID_XPI mais depuis sera un script générique pour plusieurs types différents de données (et d'environnements) Je voudrais inclure plusieurs variables lorsque j'appelle la table de hachage comme celle ci-dessous.

$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)";
}

I ' J'ai testé plusieurs approches différentes mais je n'arrive pas à la faire fonctionner. J'obtiens la syntaxe correcte (si j'imprime les valeurs des variables) telles que $ Hashtable1AuthTestID.BID_XPI mais je n'obtiens pas la valeur réelle de la table de hachage ((id 2)). p>


2 commentaires

Vous avez dupliqué la clé S_XPI dans votre exemple de table de hachage, vous voudrez peut-être corriger cela.


$ environment = "Test" est manquant ID . Si vous créez la chaîne avec ces variables, vous obtenez $ Hashtable1AuthTest.BID_XPI et non $ Hashtable1AuthTestID.BID_XPI


3 Réponses :


0
votes

Vous pouvez utiliser Get-Variable:

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

(Get-Variable -Name "$($hashtable)$($type)$($environment)ID".).Value.$method


0 commentaires

1
votes

Référencer des variables nommées individuellement en utilisant un nom d'une autre variable - bien que possible - est une approche erronée. Ne fais pas ça. La manière canonique de traiter de telles situations est d'utiliser soit un tableau, si vous voulez accéder à la structure de données, soit un objet par index:

$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

ou une table de hachage, si vous voulez accéder à structure de données ou objet par nom:

$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

Par souci d'exhaustivité, voici comment obtenir une variable en utilisant un nom d'une autre variable, mais encore une fois, ceci n'est PAS RECOMMANDÉ.

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

$hashtables[0].MBID_XPI


0 commentaires

0
votes

Si vous parvenez à l'imprimer, vous pouvez l'invoquer:

$string = '${0}{1}{2}ID.{3}' -f $hashtable,$type,$environment,$method
Invoke-Expression -Command $string