You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:05:23