2016-02-26 3 views
0

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

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

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

Просто чтобы быть ясно, что вы пытаетесь визуализировать массив в X одинаковых шириной столбцов , не упорядочить двумерный массив в таблицу с именованными столбцами? –

+0

ну, входной аргумент - это просто массив. Я разделяю его на двумерный массив, поэтому каждый массив в двумерном массиве будет напечатан как строка таблицы. Количество столбцов будет основываться на входном аргументе функции. В этом примере мы используем '5', поэтому будет 5 столбцов. Ширина должна быть равна самой длинной строке в этом столбце. –

ответ

4

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 
} 
+0

Привет Матиас, спасибо за ответ. PowerGUI показывает строку squiggly под V в '[Параметр (Обязательный, ValueFromPipeline, Position = 0)]'. Он говорит об ошибке Parsing: после именованного аргумента отсутствует оператор «=». Любая идея, почему это так? ПРИМЕЧАНИЕ. Код работает с powershell.exe, но ошибки при компиляции с помощью PowerGUI Script Editor версии 1.9.5.966. –

+0

@FiddleFreak Потому что PowerGUI ожидает, что вы будете явно отмечать каждый именованный атрибут Parameter либо '$ true', либо' $ false' (возможно, для соответствия версии 2.0, просто догадка) –

+0

ах справа, после небольшого поиска в Google, я нашел это ... https://github.com/smurawski/PowerShellGuard/issues/4. Все, что я сделал, это удалить строки '[Parameter (Обязательный, ValueFromPipeline, Position = 0)]' и '[Parameter (Position = 1)]'. Теперь отлично работает как для Powershell, так и для PowerGUI. Спасибо: D –

0

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

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

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

И тогда вы могли бы подушку из каждого элемента в эти ширины:

$row += $element.PadRight($width) 
+0

На самом деле это не _quite_, что вы хотели, поскольку ** каждый ** элемент дополняется шириной самого длинного во всем массиве. Все, что вам нужно, должно быть дополнено шириной самого широкого столбца _per__. Похоже, @Mathias имеет лучший ответ! –

+0

Спасибо, это вариант, но ваше право. Однако хорошо знать, что этот метод существует. –