Variables in command when calling hashtable

穿精又带淫゛_ 提交于 2019-12-02 16:32:56

问题


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


回答1:


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



回答2:


You could use Get-Variable:

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

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



回答3:


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


来源:https://stackoverflow.com/questions/56626844/variables-in-command-when-calling-hashtable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!