如何在PowerShell中获取变量名

ux6nzvsh  于 2023-03-23  发布在  Shell
关注(0)|答案(5)|浏览(183)

我有一个变量数组,想知道是否可以从数组中获取/返回每个变量的名称(而不是变量的值)?
例如,类似于:

$varArray = @($var1, $var2, $var3)

ForEach ($v in $varArray)
{
   *return the name of the variable here, not the value*
}

所以我会有这样的东西:
变量1
变量2
变量3
注意:我确实计划在脚本中的不同位置获取每个变量的“值”,所以这里只需要变量名。
先谢了!

jxct1oxe

jxct1oxe1#

我会从使用数组切换到使用哈希表。使哈希表键成为变量名:

$VarHT = @{Var1=$var1;Var2=$var2;Var3=$var3)

ForEach ($v in $varHT.Keys)
{
   *return the name of the variable here, not the value*
}
lo8azlld

lo8azlld2#

@ mjolino解释说这是不可能的,但是(如果你可以访问sender脚本)你可以通过使用“变量名”而不是变量(s.th.类似于C语言中指针数组的概念)将数组内容上移一层:

$varArray = @('$var1', '$var2', '$var3')

访问这些名称是很简单的:

ForEach ($v in $varArray)
{
    Write-Output "Var name: $v"
}

但是,当你想使用变量值时,你要为此付出代价。而不是:

$anotherVar = $v

您必须用途:

$anotherVar = (Get-Variable $v.substring(1)).Value

更方便的方法是将这个丑陋的表达式 Package 在一个函数中:

function Expand ($var)
{
    (Get-Variable $var.substring(1)).Value
}

然后:

$anotherVar = Expand $v
yuvru6vn

yuvru6vn3#

你可以在你的脚本开始时使用类似的东西。我过去在Ansible上不得不这样做。

<code>
$requiredParameters = @(
    @{"parameterName" = "vmname";},
    @{"parameterName" = "domain";}
)

$converted_params = @{}
$args.psobject.properties | ForEach { $converted_params[$_.Name] = $_.Value }

ForEach ($obj in $requiredParameters)
{
    If ($converted_params.ContainsKey($obj.parameterName))
    {
        New-Variable -Name $obj.parameterName `
        -Value $converted_params.$($obj.parameterName)
    }
    Else
    {
        If ($obj.ContainsKey("defaultValue"))
        {
            New-Variable -Name $obj.parameterName -Value $obj.defaultValue
        }
        Else
        {
            throw ("missing required argument: " + $obj.parameterName )
        }
    }
}
</code>
aurhwmvo

aurhwmvo4#

我一直在寻找这个问题的解决方案,并通过将变量放置在psObject中来解决它。您可以使用createParaObject函数创建psobjects并将其放置在数组中。之后,您将能够从对象中获取变量名称和值。

function createParaObject {
    Param (
        $name,
        $value
    )

    $props = @{
    Name = $name
    Value = $value
    }
    $object = new-object psobject -Property $props
    return $object
}

$a = createParaObject -name 'a' -value 1
$b = createParaObject -name 'b' -value 2
$c = createParaObject -name 'c' -value $NULL
$d = createParaObject -name 'd' -value 4

$array = $($a,$b,$c,$d)

foreach($var in $array) {
    $name = $var.Name
    $val = $var.Value
    write-host "$name : $val"
}
v440hwme

v440hwme5#

for ($i=1; $i -le 5; $i++)
{
    if ((Get-Variable -Name "var$i" -ValueOnly -ErrorAction SilentlyContinue) -eq $null){New-Variable -Name "var$i" -Value $i}
    (Get-Variable -Name "var$i").Name
    Get-Variable -Name "var$i" -ValueOnly
}
'============'
"$var1`n$var2`n$var3`n$var4`n$var5"
for ($i=1; $i -le 5; $i++)
{
    Remove-Variable "var$i" -ErrorAction SilentlyContinue;
}
'==== Already removed ==='
"$var1`n$var2`n$var3`n$var4`n$var5`n"

相关问题