Моя цель - написать функцию, которая поддерживает запись любого массива в виде таблицы, где заданные аргументы - это массив и количество столбцов, требуемых в таблице.

У меня есть следующий код ...

Function PrintArrayAsTable
{
    Param ([String[]]$array ,[Int]$numOfItemsPerRow)

    $elementCounter = 1
    [String[]]$row = @()
    [String[]]$tableArray = @()

    ForEach ($element in $array)
    {
        $row += $element
        if ($elementCounter % $numOfItemsPerRow -eq 0)
        {
            $tableArray += ,($row)
            [String[]]$row = @()
        }
        $elementCounter++
    }

    if ($row)
    {
        $tableArray += ,($row)
        [String[]]$row = @()
    }

    $tableArray | Format-Table
}

[String[]]$array = @('SamAccountName', 'msRTCSIP-UserEnabled', 'msRTCSIP-OptionFlags', 'msRTCSIP-PrimaryUserAddress', 'msRTCSIP-PrimaryHomeServer', 
                     'mail', 'msExchMasterAccountSid', 'homeMDB', 'proxyaddresses', 'legacyExchangeDN', 
                     'lastLogonTimestamp', 'logonCount', 'lastLogoff', 'lastLogon', 'pwdLastSet', 'userAccountControl', 'whenCreated', 'whenChanged', 'accountExpires', 
                     'sn', 'givenName', 'displayName', 'distinguishedName', 'initials', 'l', 'st', 'street', 'title', 'description', 'postalCode', 'physicalDeliveryOfficeName', 'telephoneNumber', 'facsimileTelephoneNumber', 'info', 'memberOf', 'co', 'department', 'company', 'streetAddress', 'employeeNumber', 'employeeType', 'objectGUID', 'employeeID', 'homeDirectory', 'homeDrive', 'scriptPath', 'objectSid', 'userPrincipalName', 'url', 'msDS-SourceObjectDN', 'manager', 'extensionattribute8')

PrintArrayAsTable $array 5

Это напечатает следующий вывод ...

SamAccountName msRTCSIP-UserEnabled msRTCSIP-OptionFlags msRTCSIP-PrimaryUserAddress msRTCSIP-PrimaryHomeServer
mail msExchMasterAccountSid homeMDB proxyaddresses legacyExchangeDN
lastLogonTimestamp logonCount lastLogoff lastLogon pwdLastSet
userAccountControl whenCreated whenChanged accountExpires sn
givenName displayName distinguishedName initials l
st street title description postalCode
physicalDeliveryOfficeName telephoneNumber facsimileTelephoneNumber info memberOf
co department company streetAddress employeeNumber
employeeType objectGUID employeeID homeDirectory homeDrive
scriptPath objectSid userPrincipalName url msDS-SourceObjectDN
manager extensionattribute8

Вместо этого я хочу, чтобы распечатка формата выглядела следующим образом ...

SamAccountName             msRTCSIP-UserEnabled   msRTCSIP-OptionFlags     msRTCSIP-PrimaryUserAddress msRTCSIP-PrimaryHomeServer
mail                       msExchMasterAccountSid homeMDB                  proxyaddresses              legacyExchangeDN
lastLogonTimestamp         logonCount             lastLogoff               lastLogon                   pwdLastSet
userAccountControl         whenCreated            whenChanged              accountExpires              sn
givenName                  displayName            distinguishedName        initials                    l
st                         street                 title                    description                 postalCode
physicalDeliveryOfficeName telephoneNumber        facsimileTelephoneNumber info                        memberOf
co                         department             company                  streetAddress               employeeNumber
employeeType               objectGUID             employeeID               homeDirectory               homeDrive
scriptPath                 objectSid              userPrincipalName        url                         msDS-SourceObjectDN
manager                    extensionattribute8

Есть идеи как это сделать?

0
Fiddle Freak 27 Фев 2016 в 01:40

2 ответа

Лучший ответ

Format-Wide выполняет в основном то, что вы уже описали.

Все, что вам нужно сделать, это создать объект с одним свойством для каждой строки, а затем ссылаться на это имя свойства с помощью Format-Wide -Property:

function Print-Grid
{
    param(
        [Parameter(Mandatory,ValueFromPipeline,Position=0)]
        [string[]]$Array,

        [Parameter(Position=1)]
        [ValidateRange(1,24)]
        [int]$ColumnCount
    )
    $GridSplat = @{
        InputObject = $Array|ForEach-Object {
            New-Object psobject -Property @{'Value' = $_}
        }
        Property    = 'Value'
    }

    if(-not $PSBoundParameters.ContainsKey('ColumnCount'))
    {
        $GridSplat['AutoSize'] = $true
    }
    else
    {
        $GridSplat['Column'] = $ColumnCount
    }

    Format-Wide @GridSplat
}
4
Mathias R. Jessen 27 Фев 2016 в 00:09

Похоже, что недостающий бит превращает ваши строки данных в аккуратные столбцы одинаковой ширины ...

Я бы попытался определить максимальную ширину столбца (скажем, длину самой длинной строки в массиве плюс 1). Вы можете сделать это, используя:

$width = ($array | %{$_.Length} | Measure-Object -Maximum).Maximum + 1

А затем вы можете расширить каждый элемент до этой ширины:

$row += $element.PadRight($width)
0
Charlie Joynt 26 Фев 2016 в 23:20