如何在PowerShell中使用变量存储的路径导航对象并获取属性?
PowerShell通过变量路径导航对象属性的解决方法
你遇到的问题根源在于:$obj."$mypath" 是试图直接访问名为Level1.Level2的单个属性,而不是先访问Level1再访问其下的Level2,自然找不到对应的值。下面给你几种实用的解决办法:
方法一:拆分路径逐个访问(最安全通用)
把路径按.拆分成单个属性名,然后循环遍历逐步导航对象:
# 示例对象 $obj = [PSCustomObject]@{ Level1 = [PSCustomObject]@{ Level2 = [PSCustomObject]@{ MyProperty = "目标值" } } } $mypath = "Level1.Level2" # 拆分路径为属性名数组 $props = $mypath.Split('.') $current = $obj # 逐个导航属性 foreach ($prop in $props) { $current = $current.$prop } # 获取最终属性值 $x = $current.MyProperty $x # 输出:目标值
方法二:使用Invoke-Expression(注意风险)
如果路径是自己可控的、安全的,可以用Invoke-Expression直接执行拼接的表达式:
$x = Invoke-Expression "`$obj.$mypath.MyProperty" $x # 输出:目标值
⚠️ 注意:如果$mypath来自不可信的外部输入,绝对不能用这个方法,因为可能会执行恶意代码。
方法三:用Select-Object链式展开(适合短路径)
如果路径不长,可以用Select-Object -ExpandProperty链式调用:
$x = $obj | Select-Object -ExpandProperty Level1 | Select-Object -ExpandProperty Level2 | Select-Object -ExpandProperty MyProperty $x # 输出:目标值
这种方法直观但灵活性差,路径越长写起来越麻烦。
内容的提问来源于stack exchange,提问作者Alexu
相关产品推荐
相关产品推荐

