我有一个变量数组,想知道是否可以从数组中获取/返回每个变量的名称(不是变量的值)?
例如,类似:
$varArray = @($var1, $var2, $var3)
ForEach ($v in $varArray)
{
*return the name of the variable here, not the value*
}
所以我会有这样的事情:
变量1
变量2
变量3
注意:我确实计划在脚本中的不同位置获取每个变量的“值”,所以这里只需要变量名。
提前致谢!
我有一个变量数组,想知道是否可以从数组中获取/返回每个变量的名称(不是变量的值)?
例如,类似:
$varArray = @($var1, $var2, $var3)
ForEach ($v in $varArray)
{
*return the name of the variable here, not the value*
}
所以我会有这样的事情:
变量1
变量2
变量3
注意:我确实计划在脚本中的不同位置获取每个变量的“值”,所以这里只需要变量名。
提前致谢!
我会从使用数组切换到使用哈希表。使哈希表键成为变量名称:
$VarHT = @{Var1=$var1;Var2=$var2;Var3=$var3)
ForEach ($v in $varHT.Keys)
{
*return the name of the variable here, not the value*
}
我一直在寻找这个问题的解决方案,并通过将变量放在 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"
}
正如@mjolinor 解释的那样,这是不可能的,但是(如果您可以访问发件人脚本)您可以通过使用“变量名称”而不是变量将数组内容上移一层(就像数组的概念一样)旧 C 中的指针):
$varArray = @('$var1', '$var2', '$var3')
然后访问名称是微不足道的:
ForEach ($v in $varArray)
{
Write-Output "Var name: $v"
}
但是,当您想使用变量值时,您为此付出了代价。代替:
$anotherVar = $v
你必须使用:
$anotherVar = (Get-Variable $v.substring(1)).Value
更方便的是将那个丑陋的表达式包装在一个函数中:
function Expand ($var)
{
(Get-Variable $var.substring(1)).Value
}
接着:
$anotherVar = Expand $v
您可以在脚本的开头使用类似的内容。过去我不得不用 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>