Powershell 是否可以在对象上定义显示数据';谁的财产?

Powershell 是否可以在对象上定义显示数据';谁的财产?,powershell,powershell-5.0,Powershell,Powershell 5.0,使用格式表命令时,不只是列出属性名称,而是可以提供包含属性名称(或某些表达式)的哈希表,以及有关该属性应如何显示的元数据(例如对齐,宽度) 是否有任何方法在输入对象的定义中提供此信息,例如,以某种方式将此信息添加到PSStandardMembers成员集中 附加信息 我的特定用例是能够在Compare ObjectProperties方法中定义默认宽度和对齐方式,以避免使用此函数的任何人每次都必须调用Format Table,使用所有这些属性元数据 function Compare-Objec

使用
格式表
命令时,不只是列出属性名称,而是可以提供包含属性名称(或某些表达式)的哈希表,以及有关该属性应如何显示的元数据(例如
对齐
宽度

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


附加信息 我的特定用例是能够在
Compare ObjectProperties
方法中定义默认宽度和对齐方式,以避免使用此函数的任何人每次都必须调用
Format Table
,使用所有这些属性元数据

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";}

PowerShell使用格式定义文件()定义对象的默认显示

要在代码中实现这一点,请通过替换在返回的对象中包含一个类型

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

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

<?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>

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

PowerShell使用格式定义文件()来定义对象的默认显示

要在代码中实现这一点,请通过替换在返回的对象中包含一个类型

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

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

<?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>

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

您可以使用它来执行此操作。非常好,谢谢@boxdog;实现这一点比希望的稍微痛苦一些,但解决了问题。我在这里找到了一个很好的教程;很乐意帮忙。我添加了我的评论作为答案,这样别人更容易找到。你可以用它来做。很好,谢谢@boxdog;实现这一点比希望的稍微痛苦一些,但解决了问题。我在这里找到了一个很好的教程;很乐意帮忙。我添加了我的评论作为答案,这样别人更容易找到。
Update-FormatData -AppendPath '.\JohnLBevan.CompareObjectPropertiesResult.Format.ps1xml'