首页 > 解决方案 > 两个列表中的格式表?

问题描述

我有这样的想法,即从 2 个单独的函数中获取输出,这些函数将 aPSCustomObject作为list返回,并将它们格式化为一个表。我的问题很简单......我不知道该怎么做。哈哈

通过我尝试的各种组合,这给了我一些有希望的结果:

$Var1 = [PSCustomObject]@{

    UserName = $env:USERNAME
    Stuff1   = 'stuff1'

} | Format-List | Out-String -Stream


$Var2 = [PSCustomObject]@{

    ComputerName = $env:COMPUTERNAME
    Stuff2       = 'stuff2'

} | Format-List | Out-String -Stream 



[PSCustomObject]@{

TableOne = $Var1.Trim().Foreach({$_})
TableTwo = $Var2.Trim()

} | Format-Table -AutoSize

输出:

TableOne                                       TableTwo                                                      
--------                                       --------                                                      
{, , UserName : Abraham, Stuff1   : stuff1...} {, , ComputerName : DESKTOP-OEREJ77, Stuff2       : stuff2...}

我说承诺它显示了$var1和 2 的实际内容,而我的其他尝试没有。我还把.foreach()操作员留在那里,以展示我试图让它发挥作用的许多不同技巧之一。有那么一瞬间,我以为Out-Stringcmdlet 可以帮我解决问题,但没有成功。

有没有人做过类似的事情?

编辑: 没关系,我想通了。

使用for循环遍历每一行,一次分配PSCustomObject一个。还使用.Where()运算符去除空格,并比较两个数组以找到最大的数以将其用作计数。

$Var1 = $([PSCustomObject]@{

    UserName = $env:USERNAME
    Stuff1   = 'stuff1'

} | Format-List | Out-String -Stream).Where{$_ -ne ''}


$Var2 = $([PSCustomObject]@{

    ComputerName = $env:COMPUTERNAME
    Stuff2       = 'stuff2'
    ExtraStuff   = 'More'

} | Format-List | Out-String -Stream).Where{$_ -ne ''} 

$Count = ($Var1.Count, $Var2.Count | Measure-Object -Maximum).Maximum
 
$(for($i=0;$i -lt $Count; $i++) {
    [PSCustomObject]@{

    TableOne = $Var1[$i]
    TableTwo = $Var2[$i]

    } 
}) | Format-Table -AutoSize

输出:

TableOne           TableTwo                      
--------           --------                      
UserName : Abraham ComputerName : DESKTOP-OEREJ77
Stuff1   : stuff1  Stuff2       : stuff2         
                   ExtraStuff   : More     

标签: powershellpowershell-5.1

解决方案


这是一种用相应元素格式化两个集合的有趣方式。

要确实支持具有多个元素的两个集合,需要对您的方法进行一些调整:

# First collection, containing 2 sample objects.
$coll1 = 
  [PSCustomObject] @{
    UserName = $env:USERNAME
    Stuff1   = 'stuff1'
  },
  [PSCustomObject] @{
    UserName = $env:USERNAME + '_2'
    Stuff1   = 'stuff2'
  }

# Second collection; ditto.
$coll2 = 
  [PSCustomObject] @{
    ComputerName = $env:COMPUTERNAME
    Stuff2       = 'stuff2'
    ExtraStuff   = 'More'
  }, 
  [PSCustomObject]@{
    ComputerName = $env:COMPUTERNAME + '_2'
    Stuff2       = 'stuff2_2'
    ExtraStuff   = 'More_2'
  }

# Stream the two collections in tandem, and output a Format-List
# representation of each object in a pair side by side.
& { 
  foreach ($i in 0..([Math]::Max($coll1.Count, $coll2.Count) - 1)) {
    [PSCustomObject] @{
      TableOne = ($coll1[$i] | Format-List | Out-String).Trim() + "`n"
      TableTwo = ($coll2[$i] | Format-List | Out-String).Trim() + "`n"
    } 
  }
} | Format-Table -AutoSize -Wrap

以上确保了多个对象正确地彼此相邻放置,并产生如下内容:

TableOne                              TableTwo
--------                              --------
UserName : jdoe                       ComputerName : WS1
Stuff1   : stuff1                     Stuff2       : stuff2
                                      ExtraStuff   : More
                                     
UserName : jdoe_2                     ComputerName : WS1_2
Stuff1   : stuff2                     Stuff2       : stuff2_2
                                      ExtraStuff   : More_2                                    

推荐阅读