Reputation: 119
I'm trying to fetch a value from a hashtable like the one below.
$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)";
}
It's working fine if I use $Hashtable1AuthTestID.BID_XPI
but since this will be a generic script for several different type of data (and environments) I would like to include several variable when I call the hashtable such as the one below.
# 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
I've tested several different approaches but can't get it working. I do get the correct syntax (if I print the values from the variables) such as $Hashtable1AuthTestID.BID_XPI
but I don't get the actual value from the hashtable ((id 2)).
Upvotes: 0
Views: 105
Reputation: 1884
If you are able to print it you can invoke it:
$string = '${0}{1}{2}ID.{3}' -f $hashtable,$type,$environment,$method
Invoke-Expression -Command $string
Upvotes: 0
Reputation: 200273
Referencing individually named variables by using a name from another variable -although possible- is a misguided approach. Don't do it. The canonical way of dealing with situations like this is to use either an array, if you want to access the data structure or object by index:
$hashtables = @()
$hashtables += @{
"BID_XPI" = "(id 2)"
"MBID_XPI" = "(id 3)"
...
}
$hashtables[0].MBID_XPI
or a hashtable, if you want to access the data structure or object by name:
$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
For the sake of completeness, here is how you would get a variable by using a name from another variable, but again, this is NOT RECOMMENDED.
$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
Upvotes: 1
Reputation: 18051
You could use Get-Variable
:
$hashtable = "Hashtable1"
$type = "Auth"
$environment = "Test"
$method = "BID_XPI"
(Get-Variable -Name "$($hashtable)$($type)$($environment)ID".).Value.$method
Upvotes: 0