如何将PowerShell哈希表转换为PSCustomObject?
将PowerShell哈希表转换为PSCustomObject以简化导航
当使用Import-PowerShellDataFile导入psd1文件时,得到的是嵌套哈希表结构,直接通过属性名导航数据会非常繁琐。
示例psd1文件内容
@{ AllNodes = @( @{ NodeName = 'SRV1' Role = 'Application' RunCentralAdmin = $true }, @{ NodeName = 'SRV2' Role = 'DistributedCache' RunCentralAdmin = $true }, @{ NodeName = 'SRV3' Role = 'WebFrontEnd' PSDscAllowDomainUser = $true PSDscAllowPlainTextPassword = $true CertificateFolder = '\\mediasrv\Media' }, @{ NodeName = 'SRV4' Role = 'Search' }, @{ NodeName = '*' DatabaseServer = 'sql1' FarmConfigDatabaseName = '__FarmConfig' FarmContentDatabaseName = '__FarmContent' CentralAdministrationPort = 1234 RunCentralAdmin = $false } ); NonNodeData = @{ Comment = 'No comment' } }
导入后的哈希表现状
导入后的数据是嵌套哈希表,无法直接用点符号访问属性:
$psdnode = Import-PowerShellDataFile .\nodefile.psd1 $psdnode Name Value ---- ----- AllNodes {System.Collections.Hashtable, System.Collect... NonNodeData {Comment} $psdnode.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Hashtable System.Object
转换为PSCustomObject的解决方案
使用递归函数将嵌套哈希表完整转换为PSCustomObject,这样就能通过点符号轻松导航数据:
function ConvertTo-PSCustomObject { param( [Parameter(ValueFromPipeline)] $InputObject ) process { if ($InputObject -is [hashtable]) { $obj = [PSCustomObject]@{} foreach ($key in $InputObject.Keys) { $obj | Add-Member -MemberType NoteProperty -Name $key -Value (ConvertTo-PSCustomObject $InputObject[$key]) } $obj } elseif ($InputObject -is [array]) { $InputObject | ForEach-Object { ConvertTo-PSCustomObject $_ } } else { $InputObject } } } # 执行导入与转换 $psdnode = Import-PowerShellDataFile .\nodefile.psd1 | ConvertTo-PSCustomObject # 示例:通过点符号访问属性 $psdnode.AllNodes[0].NodeName # 输出 SRV1 $psdnode.NonNodeData.Comment # 输出 No comment $psdnode.AllNodes.Where({$_.NodeName -eq '*'}).DatabaseServer # 输出 sql1
转换后,所有层级的哈希表都会被转为PSCustomObject,数组内的哈希表也会被逐个转换,完全保留原有数据结构的同时,大幅提升数据导航的便捷性。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

