如何在PowerShell中将文本转换为变量名?
解决PowerShell中通过字符串获取变量引用的问题
你需要通过字符串(比如'color')获取对应的数组变量,进而像直接使用数组那样操作它,以下是正确的实现方式和问题分析:
正确实现方法
方法1:使用Get-Variable的-ValueOnly参数(推荐)
这是最安全直观的方式,直接获取目标变量的值:
$select = 'color' # 获取字符串对应的变量值 $targetArray = Get-Variable -Name $select -ValueOnly
之后即可正常执行你需要的操作:
Write-Host $targetArray # 输出 red green blue Write-Host $targetArray[1] # 输出 green list $targetArray # 逐行输出 red、green、blue
方法2:访问Get-Variable返回对象的Value属性
和方法1效果一致,只是写法不同:
$targetArray = (Get-Variable $select).Value
方法3:Invoke-Expression(不推荐)
虽然能实现需求,但如果字符串来源不可信,会存在代码注入风险,谨慎使用:
$targetArray = Invoke-Expression "`$$select"
你之前尝试失败的原因
$'color'/$('color'):仅返回字符串'color',并非变量引用-join($'color'):对字符串'color'做拼接操作,结果还是字符串Get-Variable 'color':返回的是变量对象,而非变量的值,需要访问.Value属性才能拿到数组Get-Variable(color):这里直接传入数组$color作为参数,不符合Get-Variable的参数要求,会报错$(Get-Variable 'color'):仍然返回变量对象,未提取实际值
完整测试代码
$trees = @("oak","pine","teak") $fruit = @("apple","pear","banana") $color = @("red","green","blue") function list($items){ foreach ($item in $items){ Write-Host $item } } $select = 'color' $targetArray = Get-Variable -Name $select -ValueOnly # 验证操作 Write-Host $targetArray Write-Host $targetArray[1] list $targetArray
内容的提问来源于stack exchange,提问作者ian
相关产品推荐
相关产品推荐

