Можно ли определить отображаемые данные по свойствам объекта? - PullRequest
0 голосов
/ 30 мая 2018

При использовании команды 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";}

1 Ответ

0 голосов
/ 30 мая 2018

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>

Сохраните этот файлas YourTypeName.format.ps1xml.

Наконец, импортируйте это определение в ваш скрипт:

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

Теперь, когда вы вызываете свою функцию, вывод будет продиктован информацией в файле определения.

...