能否在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
相关产品推荐
相关产品推荐

