使用 PSObject 输出数组;限制为 4 列

Outputting arrays with PSObject; Limitted to 4 columns

我的代码片段:

$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 

 }

我想做的是将我的端口扫描器的结果打印成漂亮的 table。 当有 4 列或更少列时,这工作正常:

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

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

Write-Output $out | Format-Table

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

谢谢

如您所见,默认情况下,PowerShell 将您的输出格式化为 table,但当被格式化的对象具有超过 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

您可以在 .format.ps1xml 文件中制作您自己的类型和 table 视图,如果您觉得这样做值得的话。这是一个简单的例子。格式记录在 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