我的代码片段:
$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 或更少时,此方法效果很好:
但是每当我添加更多列时,即使屏幕上有空间,它也会将其转换为列表:
当我尝试向其附加“Format-Table”时,它每次都会写出标题:
Write-Output $out | Format-Table
如果我将行
"Write-Output $out"
复制到循环之外,它只会打印出最后一个成员。关于如何解决这个问题有什么想法吗?
正如您所发现的,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
如果值得的话,您可以在 .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