是否可以在对象的属性上定义显示数据?
Is it possible to define display data on an object's properties?
当使用 Format-Table
命令时,不是简单地列出 属性 名称,而是提供一个选项来提供包含 属性 名称(或某些表达式)以及元数据的哈希表关于 属性 应该如何显示(例如 align
、width
)。
$InputObject | Format-Table -Property @{Expression='Property1'; Width=100; Align="right";}, @{Expression='Property2'; Width=100; Align="left";}
有没有办法在输入对象的定义中提供此信息,例如以某种方式将此信息添加到 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 使用格式定义文件 (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'
现在当您调用函数时,输出将由定义文件中的信息决定。
当使用 Format-Table
命令时,不是简单地列出 属性 名称,而是提供一个选项来提供包含 属性 名称(或某些表达式)以及元数据的哈希表关于 属性 应该如何显示(例如 align
、width
)。
$InputObject | Format-Table -Property @{Expression='Property1'; Width=100; Align="right";}, @{Expression='Property2'; Width=100; Align="left";}
有没有办法在输入对象的定义中提供此信息,例如以某种方式将此信息添加到 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 使用格式定义文件 (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'
现在当您调用函数时,输出将由定义文件中的信息决定。