代码之家  ›  专栏  ›  技术社区  ›  JohnLBevan

是否可以定义对象属性的显示数据?

  •  0
  • JohnLBevan  · 技术社区  · 6 年前

    当使用 Format-Table 命令,而不是简单地列出属性名,有一个选项可以提供包含属性名(或某些表达式)的哈希表,以及有关如何显示该属性的元数据(例如。 align , width )

    $InputObject | Format-Table -Property @{Expression='Property1'; Width=100; Align="right";}, @{Expression='Property2'; Width=100; Align="left";}
    

    是否有任何方法可以在输入对象的定义中提供此信息,例如,以某种方式将此信息添加到 PSStandardMembers 成员集。


    附加信息

    我的特定用例是能够在 Compare-ObjectProperties 方法,以避免任何使用此函数的人必须调用 格式表 每次都使用所有这些属性元数据。

    function Compare-ObjectProperties { 
        [CmdletBinding()]
        Param(
            [Parameter(Mandatory = $true)]
            $InputObject
            ,
            [Parameter(Mandatory = $true)]
            $CompareObject
        ) 
        Process {
            $properties = @($InputObject, $CompareObject) | Get-Member -MemberType NoteProperty, Property | Select-Object -ExpandProperty Name | Sort-Object -Unique
            $properties | %{
                [pscustomobject][ordered]@{
                    PropertyName = $_
                    InputObject = $InputObject."$_"
                    CompareObject = $CompareObject."$_"
                }
            }
        }
    }
    Clear-Host
    $a = Get-ADUser someone
    $b = Get-ADUser sometwo
    Compare-ObjectProperties $a $b | 
        Where-Object {$_.InputObject -eq $_.CompareObject} | 
        Format-Table @{Expression='PropertyName'; Width=20;}, @{Expression='InputObject'; Width=100; Align="right";}, @{Expression='CompareObject'; Width=100; Align="left";}
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   JohnLBevan    6 年前

    powershell使用格式定义文件( Format.ps1xml )定义对象的默认显示。

    若要在代码中实现此功能,请通过替换在返回的对象中包含类型;

    [pscustomobject][ordered]@{
        PropertyName = $_
        InputObject = $InputObject."$_"
        CompareObject = $CompareObject."$_"
    }
    

    用:

    $result = [pscustomobject][ordered]@{
        PropertyName = $_
        InputObject = $InputObject."$_"
        CompareObject = $CompareObject."$_"
    }
    $result.PSObject.TypeNames.Insert(0,'JohnLBevan.CompareObjectPropertiesResult')
    $result
    

    然后使用适当的属性名和设置为给定类型/创建定义文件:

    <?xml version="1.0" encoding="utf-8" ?>
    <Configuration>
        <ViewDefinitions>
            <View>
                <Name>Default</Name>
                <ViewSelectedBy>
                    <TypeName>JohnLBevan.CompareObjectPropertiesResult</TypeName>
                </ViewSelectedBy>
                <TableControl>
                    <TableHeaders>
                        <TableColumnHeader>
                            <Width>20</Width>
                            <Alignment>left</Alignment>
                        </TableColumnHeader>
                        <TableColumnHeader>
                            <Width>90</Width>
                            <Alignment>right</Alignment>
                        </TableColumnHeader>
                        <TableColumnHeader>
                            <Width>90</Width>
                            <Alignment>left</Alignment>
                        </TableColumnHeader>
                    </TableHeaders>
                    <TableRowEntries>
                        <TableRowEntry>
                            <TableColumnItems>
                                <TableColumnItem>
                                    <PropertyName>PropertyName</PropertyName>
                                </TableColumnItem>
                                <TableColumnItem>
                                    <PropertyName>InputObject</PropertyName>
                                </TableColumnItem>
                                <TableColumnItem>
                                    <PropertyName>CompareObject</PropertyName>
                                </TableColumnItem>
                            </TableColumnItems>
                        </TableRowEntry>
                    </TableRowEntries>
                </TableControl>
            </View>
        </ViewDefinitions>
    </Configuration>
    

    将此文件另存为 YourTypeName.format.ps1xml .

    最后,将此定义导入脚本:

    Update-FormatData -AppendPath '.\JohnLBevan.CompareObjectPropertiesResult.Format.ps1xml'
    

    现在,当调用函数时,输出将由定义文件中的信息决定。