为什么使用 PowerShell 将数据输出为表格限制为 4 列?

问题描述 投票:0回答:2

我的代码片段:

$ipaddress = '127.0.0.1'
$port = 135,137,138,139,443,445   

for($i=0; $i -lt $port.length; $i++)
{

$out = new-object psobject

$out | add-member noteproperty Host $ipaddress
$out | add-member noteproperty Port $port[$i]
$out | add-member noteproperty Isopen $isopen[$i]
$out | add-member noteproperty Desc "Desc"
$out | add-member noteproperty Notes $Notes[$i]
$out | add-member noteproperty Issue $issue[$i]


Write-Output $out 

 }

我想做的是将端口扫描仪的结果打印到一个漂亮的表格中。 当列数为 4 或更少时,此方法效果很好:

ss1

但是每当我添加更多列时,即使屏幕上有空间,它也会将其转换为列表:

ss2

当我尝试向其附加“Format-Table”时,它每次都会写出标题:

Write-Output $out | Format-Table

SS3

如果我将行

"Write-Output $out"
复制到循环之外,它只会打印出最后一个成员。关于如何解决这个问题有什么想法吗?

powershell datatable output
2个回答
2
投票

正如您所发现的,PowerShell 默认情况下会在表中格式化输出,但当要格式化的对象具有超过 4 个可见成员时,会选择列表视图。

您可以通过显式调用您首选的

Format-*
命令来覆盖此设置。只需“收集”变量中的所有输出对象,然后将它们显式通过管道传输到
Format-Table
:

$ipaddress = '127.0.0.1'
$port = 135,137,138,139,443,445   

$objects = for($i=0; $i -lt $port.length; $i++)
{

    $out = new-object psobject

    $out | add-member noteproperty Host $ipaddress
    $out | add-member noteproperty Port $port[$i]
    $out | add-member noteproperty Isopen $isopen[$i]
    $out | add-member noteproperty Desc "Desc"
    $out | add-member noteproperty Notes $Notes[$i]
    $out | add-member noteproperty Issue $issue[$i]

    Write-Output $out
}

$objects |Format-Table

除非您在 PowerShell 2.0 上运行代码,否则我建议使用 3.0

[pscustomobject]
语法来创建对象(并且可能将整个事物转变为函数):

function Get-PortStatus
{
  param(
    [string]$IPAddress = '127.0.0.1',
    [intp[]]$Port = 135,137,138,139,443,445
  )

  # populate $isopen, $notes, $issue etc. here ...

  for($i=0; $i -lt $port.length; $i++)
  {
    # Write-Output is implied when the new object isn't assigned to anything
    [pscustomobject]@{
      Host   = $ipaddress
      Port   = $port[$i]
      IsOpen = $isopen[$i]
      Desc   = "Desc"
      Notes  = $Notes[$i]
      Issue  = $issue[$i]
    }
  }
}

现在你可以做:

PS C:\Users\Gabrielius> Get-PortStatus -IPAddress '10.0.0.10' -Port 80,443 |Format-Table

1
投票

如果值得的话,您可以在 .format.ps1xml 文件中创建自己的类型和表视图。 这是一个简单的例子。 该格式记录在 About Format.ps1xml 实际上,powershell 中的所有自定义对象都有格式文件。 这是相当样板的。 我希望有一个 $numPropsToTable 偏好变量。

myobject.format.ps1xml:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
  <ViewDefinitions>
    <View>
      <Name>myobject</Name>
      <ViewSelectedBy>
        <TypeName>myobject</TypeName>
      </ViewSelectedBy>
      <TableControl>
        <TableHeaders>
          <TableColumnHeader>
            <Width>16</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Width>16</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Width>16</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Width>16</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Width>16</Width>
          </TableColumnHeader>
        </TableHeaders>
        <TableRowEntries>
          <TableRowEntry>
            <TableColumnItems>
              <TableColumnItem>
                <PropertyName>Name</PropertyName>
              </TableColumnItem>
              <TableColumnItem>
                <PropertyName>Address</PropertyName>
              </TableColumnItem>
              <TableColumnItem>
                <PropertyName>City</PropertyName>
              </TableColumnItem>
              <TableColumnItem>
                <PropertyName>State</PropertyName>
              </TableColumnItem>
              <TableColumnItem>
                <PropertyName>Zip</PropertyName>
              </TableColumnItem>
            </TableColumnItems>
          </TableRowEntry>
        </TableRowEntries>
      </TableControl>
    </View>
  </ViewDefinitions>
</Configuration>
update-formatdata myobject.format.ps1xml
[pscustomobject]@{name='me';address='here';city='la';state='ca';zip=11111
  PSTypeName = 'MyObject'}

Name             Address          City             State            Zip
----             -------          ----             -----            ---
me               here             la               ca               11111
© www.soinside.com 2019 - 2024. All rights reserved.