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

能否在PowerShell对象属性中定义默认显示格式信息?

自定义PowerShell对象的默认格式化规则

当然可以!这正是PowerShell中PSStandardMembers成员集的用武之地——你可以把默认的格式化规则直接嵌入到自定义对象里,这样使用你的Compare-ObjectProperties函数的用户根本不用手动写那些繁琐的Format-Table参数,直接输出对象就能得到规整的表格。

针对你的场景,我们可以修改函数,给输出的每个pscustomobject添加内置的表格格式化规则,具体实现如下:

修改后的完整函数代码

function Compare-ObjectProperties {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true)]
        $InputObject
        ,
        [Parameter(Mandatory = $true)]
        $CompareObject
    )
    Process {
        # 定义默认的表格格式化规则,和你之前用在Format-Table的参数结构一致
        $tableFormat = @(
            @{Label='PropertyName'; Expression='PropertyName'; Width=20; Align='left'},
            @{Label='InputObject'; Expression='InputObject'; Width=100; Align='right'},
            @{Label='CompareObject'; Expression='CompareObject'; Width=100; Align='left'}
        )

        # 创建格式化视图定义
        $formatView = New-Object System.Management.Automation.FormatViewDefinition -ArgumentList 'TableView', $tableFormat

        # 定义PSStandardMembers成员集,包含默认显示属性和格式化视图
        $standardMembers = [System.Management.Automation.PSMemberInfo[]]@(
            New-Object System.Management.Automation.PSPropertySet -ArgumentList 'DefaultDisplayPropertySet', @('PropertyName', 'InputObject', 'CompareObject'),
            New-Object System.Management.Automation.PSMemberSet -ArgumentList 'PSStandardMembers', @($formatView)
        )

        $properties = @($InputObject, $CompareObject) | Get-Member -MemberType NoteProperty, Property | Select-Object -ExpandProperty Name | Sort-Object -Unique
        $properties | ForEach-Object {
            # 创建自定义对象
            $outputObj = [pscustomobject][ordered]@{
                PropertyName = $_
                InputObject = $InputObject."$_"
                CompareObject = $CompareObject."$_"
            }
            # 给对象添加PSStandardMembers成员集
            $outputObj | Add-Member -MemberType MemberSet -Name 'PSStandardMembers' -Value $standardMembers -Force
            # 输出对象
            $outputObj
        }
    }
}

使用效果

现在用户调用你的函数时,只需要写:

Clear-Host
$a = Get-ADUser someone
$b = Get-ADUser sometwo
Compare-ObjectProperties $a $b | Where-Object {$_.InputObject -eq $_.CompareObject}

或者就算手动加Format-Table不带参数:

Compare-ObjectProperties $a $b | Where-Object {$_.InputObject -eq $_.CompareObject} | Format-Table

都会自动应用你预先定义好的列宽和对齐方式,完全省去了用户手动写那些哈希表参数的麻烦。

额外说明

  • 如果用户有特殊需求,想要临时覆盖默认格式,还是可以手动指定Format-Table的自定义参数,PowerShell会优先使用用户指定的规则。
  • 除了表格视图,你还可以用同样的方式定义列表视图(ListView)等其他格式,只需要修改FormatViewDefinition的参数即可。

内容的提问来源于stack exchange,提问作者JohnLBevan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:10:47