PowerShell中如何获取PSCustomObject变量名构建扁平化全局哈希表
PowerShell 自定义对象转扁平化哈希表实现方案
两种思路都可以实现,对应你写的两个循环结构分别补全逻辑即可:
方案1:基于变量名字符串列表遍历(推荐)
你提到的myMissingFunction1直接用PowerShell内置的Get-Variable cmdlet即可实现,通过变量名直接拉取对应对象,逻辑稳定不会出现匹配错误。
完整代码如下:
$result = @{} # 填入所有需要处理的PSCustomObject变量名 $varNameList = @('myObject1','myObject2') foreach($name in $varNameList) { # 按名称获取变量值,根据变量实际作用域调整Scope参数:Script/Global/Local $obj = Get-Variable -Name $name -Scope Script -ValueOnly -ErrorAction Stop foreach($p in $obj.PSObject.Properties) { $result["$name.$($p.Name)"] = $p.Value } }
参数说明:
-ValueOnly:直接返回变量存储的值,不需要额外访问.Value属性-ErrorAction Stop:变量名不存在时直接抛出错误,避免静默生成空值-Scope:如果变量是全局级别的,把参数值改为Global即可,当前作用域变量用Local
方案2:直接传入对象反查变量名
你提到的myMissingFunction2需要通过变量值反向匹配变量名,注意PSCustomObject是引用类型,通过引用相等判断即可匹配到对应变量,仅适用于引用类型对象。
完整代码如下:
$result = @{} # 直接传入所有需要处理的对象 foreach($obj in @($myObject1, $myObject2)) { # 查找当前作用域内值与传入对象引用一致的变量,取第一个匹配结果 $varMeta = Get-Variable -Scope Script | Where-Object { $_.Value -eq $obj } | Select-Object -First 1 if(-not $varMeta) { continue } $name = $varMeta.Name foreach($p in $obj.PSObject.Properties) { $result["$name.$($p.Name)"] = $p.Value } }
注意事项:
- 如果同一个对象被赋值给多个变量,只会取遍历到的第一个变量名作为键前缀
- 值类型对象不要用该方案,会出现匹配错误
- 同样根据变量实际存放的作用域调整
-Scope参数
执行完上述代码后,$result就是你需要的扁平化全局哈希表,你示例结果里的myObject2.Sate是笔误,上述代码会正确生成myObject2.State键。
内容的提问来源于stack exchange,提问作者Carsten
相关产品推荐
相关产品推荐

