Variables in command when calling hashtable

Question

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)).

Solution

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