Powershell 将输出二维数组作为格式表写入

Powershell 将输出二维数组作为格式表写入,powershell,powershell-3.0,Powershell,Powershell 3.0,我的目标是编写一个函数,支持将任何数组作为表写入,其中给定的参数是数组,以及表中所需的列数 我有以下代码 Function PrintArrayAsTable { Param ([String[]]$array ,[Int]$numOfItemsPerRow) $elementCounter = 1 [String[]]$row = @() [String[]]$tableArray = @() ForEach ($element in $array)

我的目标是编写一个函数,支持将任何数组作为表写入,其中给定的参数是数组,以及表中所需的列数

我有以下代码

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
你知道怎么做吗?

基本上就是你所描述的

您只需为每个字符串构造一个具有单个属性的对象,然后使用
格式宽度-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
}
基本上你已经描述过了

您只需为每个字符串构造一个具有单个属性的对象,然后使用
格式宽度-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
}

看起来缺少的是将数据行转换成整齐、等宽的列

我会尝试计算出一列所需的最大宽度(例如,数组中最长字符串的长度加1)。您可以使用以下方法执行此操作:

$width = ($array | %{$_.Length} | Measure-Object -Maximum).Maximum + 1
然后可以将每个元素填充到这个宽度:

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

看起来缺少的是将数据行转换成整齐、等宽的列

我会尝试计算出一列所需的最大宽度(例如,数组中最长字符串的长度加1)。您可以使用以下方法执行此操作:

$width = ($array | %{$_.Length} | Measure-Object -Maximum).Maximum + 1
然后可以将每个元素填充到这个宽度:

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

我在尝试做类似的事情时发现了这篇文章,并且似乎找到了一种不同的方法

$arrayName | select-object -Property @{Name = 'Col1 name'; Expression = { $_[1]}},
                                     @{Name = 'Col2 name'; Expression = { $_[2]}},
                                     @{Name = 'Col3 name'; Expression = { $_[3]}},
                                     @{Name = 'Col4 name'; Expression = { $_[4]}} 

我在尝试做类似的事情时发现了这篇文章,并且似乎找到了一种不同的方法

$arrayName | select-object -Property @{Name = 'Col1 name'; Expression = { $_[1]}},
                                     @{Name = 'Col2 name'; Expression = { $_[2]}},
                                     @{Name = 'Col3 name'; Expression = { $_[3]}},
                                     @{Name = 'Col4 name'; Expression = { $_[4]}} 

如果你想控制列格式,这里是完整的答案

$s1errorcode_list | select-object -Property @{Name = 'Col1 name'; Expression = { $_[1]}},
                                        @{Name = 'Col2 name'; Expression = { $_[2]}},
                                        @{Name = 'Col3 name'; Expression = { $_[3]}},
                                        @{Name = 'Col4 name'; Expression = { $_[4]}} | 
                       format-table -Property @{ Expression = 'Col1 name'; width=6 },
                                              @{ Expression = 'Col2 name'; width=84 },
                                              @{ Expression = 'Col3 name'; width=80 },
                                              @{ Expression = 'Col4 name'}

如果你想控制列格式,这里是完整的答案

$s1errorcode_list | select-object -Property @{Name = 'Col1 name'; Expression = { $_[1]}},
                                        @{Name = 'Col2 name'; Expression = { $_[2]}},
                                        @{Name = 'Col3 name'; Expression = { $_[3]}},
                                        @{Name = 'Col4 name'; Expression = { $_[4]}} | 
                       format-table -Property @{ Expression = 'Col1 name'; width=6 },
                                              @{ Expression = 'Col2 name'; width=84 },
                                              @{ Expression = 'Col3 name'; width=80 },
                                              @{ Expression = 'Col4 name'}

需要明确的是,您试图以X等宽列呈现数组,而不是将二维数组排列到具有命名列的表中?输入arg只是一个数组。我将其分离为二维数组,因此二维数组中的每个数组都将作为表的一行打印。列的数量将基于函数的输入参数。在本例中,我们使用
5
,因此将有5列。宽度应等于该列中最长的字符串。为了清楚起见,您试图在X等宽列中呈现数组,而不是将二维数组排列到具有命名列的表中?输入参数只是一个数组。我将其分离为二维数组,因此二维数组中的每个数组都将作为表的一行打印。列的数量将基于函数的输入参数。在本例中,我们使用
5
,因此将有5列。宽度应该等于该列中最长的字符串。实际上,这并不是您想要的,因为每个元素都被填充到整个数组中最长字符串的宽度。您需要的是将每一列填充到最宽的宽度。看来@Mathias有更好的答案!谢谢,这是一个选择,但你的权利。但是,很高兴知道这个方法也存在。实际上,这并不是您想要的,因为每个元素都被填充到整个数组中最长元素的宽度。您需要的是将每一列填充到最宽的宽度。看来@Mathias有更好的答案!谢谢,这是一个选择,但你的权利。不过,很高兴知道这种方法也存在。嗨,Mathias,谢谢你的回复。PowerGUI在“[参数(必需,ValueFromPipeline,位置=0)]”中的V下显示一条曲线。它表示解析错误:命名参数后缺少“=”运算符。知道为什么吗?注意:该代码确实适用于powershell.exe,但在使用PowerGUI脚本编辑器版本1.9.5.966编译时出错。@FiddleFreak,因为PowerGUI希望您显式标记每个命名参数属性
$true
$false
(可能是为了符合版本2.0的要求,只是猜测一下)啊,您的权利,在谷歌搜索了一下后,我发现了这个。我所做的就是删除行
[参数(必需,valuefrompipline,Position=0)]
[参数(Position=1)]
。Powershell和PowerGUI现在运行良好。谢谢:DDon不要删除它们(它们有用途),只要给它们一个值(即,
[参数(强制=$true,ValueFromPipeline=$true,Position=0)]
)为什么要在可以使用计算属性时构造对象
$GridSplat={InputObject=$Array;Property={$\u};Force=$true}
?您好,感谢您的回复。PowerGUI在“[参数(必需,ValueFromPipeline,位置=0)]”中的V下显示一条曲线。它表示解析错误:命名参数后缺少“=”运算符。知道为什么吗?注意:该代码确实适用于powershell.exe,但在使用PowerGUI脚本编辑器版本1.9.5.966编译时出错。@FiddleFreak,因为PowerGUI希望您显式标记每个命名参数属性
$true
$false
(可能是为了符合版本2.0的要求,只是猜测一下)啊,您的权利,在谷歌搜索了一下后,我发现了这个。我所做的就是删除行
[参数(必需,valuefrompipline,Position=0)]
[参数(Position=1)]
。Powershell和PowerGUI现在运行良好。谢谢:DDon不要删除它们(它们是有用途的),只需给它们一个值(即,
[参数(必需=$true,ValueFromPipeline=$true,Position=0)]
)为什么要在可以使用计算属性的情况下构造对象
$GridSplat={InputObject=$Array;Property={$\u};Force=$true}