You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何在PowerShell中实现指定四列表格的正确显示

解决PowerShell多列表格输出异常问题

原始代码场景

现有一段存储设备监控变量的PowerShell哈希表代码:

$Tabla = @{
'01-Name' = $cambiumEffectiveDeviceName.Data
'02-Uptime (DD:HH:MM:SS)' = $cambiumSystemUptime.Data
'03-RSSI (dBm)' = $cambiumSTADLRSSI.Data
'04-SNR (dB)' = $cambiumSTADLSNR.Data
'05-TX Power (dBm)' = $cambiumSTAConductedTXPower.Data
'06-MCS Downlink' = $cambiumSTADownlinkMCSMode.Data
'07-MCS Uplink' = $cambiumSTAUplinkMCSMode.Data
'08-TX Capacity (%)' = $staTxCapacity.Data
'09-TX Quality (%)' = $staTxQuality.Data
'10-ARP Table (MAC, IP, IF)' = $arp_table.Data
'11-Port Forwarding (PORT)' = $portfwdtable.Data
}

# 输出表格
$Tabla | Sort-Object -Property Name | Format-Table

预期输出格式

需要将输出整理为Num、Name、Data、Units四列,按Num列排序,Data列显示变量的实际值:

Num   Name          Data (from the variable)          Units
01    Name          $cambiumEffectiveDeviceName.Data  Name
02    Uptime        $cambiumSystemUptime.Data         DD:HH:MM:SS
03    RSSI          $cambiumSTADLRSSI.Data            dBm
04    SNR           $cambiumSTADLSNR.Data             dB
05    TX Power      $cambiumSTAConductedTXPower.Data  dBm
06    MCS Downlink  $cambiumSTADownlinkMCSMode.Data   Mode
07    MCS Uplink    $cambiumSTAUplinkMCSMode.Data     Mode
08    TX Capacity   $staTxCapacity.Data               %
09    TX Quality    $staTxQuality.Data                %
10    ARP Table     $arp_table.Data                   MAC,IP,IF
11    Port Forward  $portfwdtable.Data                Port

失败尝试与异常输出

尝试用数组存储哈希表,但输出列混乱:

# 创建表格数组
$Tabla = @(
    @{Num='01';Name='Name';Data=$cambiumEffectiveDeviceName.Data;Units='Name' }
    @{Num='02';Name='Uptime';Data=$cambiumSystemUptime.Data;Units='DD:HH:MM:SS' }
    @{Num='03';Name='RSSI';Data=$cambiumSTADLRSSI.Data;Units='dBm' }
    @{Num='04';Name='SNR';Data=$cambiumSTADLSNR.Data;Units='dB' }
    @{Num='05';Name='TX Power';Data=$cambiumSTAConductedTXPower.Data;Units='dBm' }
    @{Num='06';Name='MCS Downlink';Data=$cambiumSTADownlinkMCSMode.Data;Units='Mode' }
    @{Num='07';Name='MCS Uplink';Data=$cambiumSTAUplinkMCSMode.Data;Units='Mode' }
    @{Num='08';Name='TX Capacity';Data=$staTxCapacity.Data;Units='%' }
    @{Num='09';Name='TX Quality';Data=$staTxQuality.Data;Units='%' }
    @{Num='10';Name='ARP Table';Data=$arp_table.Data;Units='MAC,IP,IF' }
    @{Num='11';Name='Port Forward';Data=$portfwdtable.Data;Units='Port' }
)
# 显示表格
$Tabla | Sort-Object -Property Num | Format-Table -Property Num, Name, Data, Units

异常输出:

Num Name  Data Units
--- ----  ---- -----
    Units
    Num
    Data
    Name
    Units
    Num
    Data
    Name
    Units
    Num
    Data
    Name
    Units
    Num
    Data
    Name
    Units
    Num
    Data
    Name
    Units
    Num
    Data
    Name
    Units
    Num
    Data
    Name
    Units
    Num
    Data
    Name
    Units

解决方案

核心问题原因

直接将哈希表放入数组时,PowerShell会默认枚举哈希表的键值对,无法识别为表格列。必须将哈希表转换为自定义对象,让PowerShell识别对象属性作为表格列。

修正后的代码方案1:直接定义自定义对象数组

# 创建自定义对象数组
$Tabla = @(
    [PSCustomObject]@{Num='01';Name='Name';Data=$cambiumEffectiveDeviceName.Data;Units='Name' }
    [PSCustomObject]@{Num='02';Name='Uptime';Data=$cambiumSystemUptime.Data;Units='DD:HH:MM:SS' }
    [PSCustomObject]@{Num='03';Name='RSSI';Data=$cambiumSTADLRSSI.Data;Units='dBm' }
    [PSCustomObject]@{Num='04';Name='SNR';Data=$cambiumSTADLSNR.Data;Units='dB' }
    [PSCustomObject]@{Num='05';Name='TX Power';Data=$cambiumSTAConductedTXPower.Data;Units='dBm' }
    [PSCustomObject]@{Num='06';Name='MCS Downlink';Data=$cambiumSTADownlinkMCSMode.Data;Units='Mode' }
    [PSCustomObject]@{Num='07';Name='MCS Uplink';Data=$cambiumSTAUplinkMCSMode.Data;Units='Mode' }
    [PSCustomObject]@{Num='08';Name='TX Capacity';Data=$staTxCapacity.Data;Units='%' }
    [PSCustomObject]@{Num='09';Name='TX Quality';Data=$staTxQuality.Data;Units='%' }
    [PSCustomObject]@{Num='10';Name='ARP Table';Data=$arp_table.Data;Units='MAC,IP,IF' }
    [PSCustomObject]@{Num='11';Name='Port Forward';Data=$portfwdtable.Data;Units='Port' }
)

# 按Num排序并优化列宽输出
$Tabla | Sort-Object -Property Num | Format-Table -Property Num, Name, Data, Units -AutoSize

优化方案2:基于原始哈希表自动转换

无需重复编写变量映射,直接从原始哈希表提取Num、Name、Units信息:

$Tabla = @{
'01-Name' = $cambiumEffectiveDeviceName.Data
'02-Uptime (DD:HH:MM:SS)' = $cambiumSystemUptime.Data
'03-RSSI (dBm)' = $cambiumSTADLRSSI.Data
'04-SNR (dB)' = $cambiumSTADLSNR.Data
'05-TX Power (dBm)' = $cambiumSTAConductedTXPower.Data
'06-MCS Downlink' = $cambiumSTADownlinkMCSMode.Data
'07-MCS Uplink' = $cambiumSTAUplinkMCSMode.Data
'08-TX Capacity (%)' = $staTxCapacity.Data
'09-TX Quality (%)' = $staTxQuality.Data
'10-ARP Table (MAC, IP, IF)' = $arp_table.Data
'11-Port Forwarding (PORT)' = $portfwdtable.Data
}

# 处理原始哈希表生成自定义对象
$formattedTable = $Tabla.GetEnumerator() | ForEach-Object {
    # 拆分键名获取Num和剩余部分
    $num, $rest = $_.Name -split '-', 2
    # 提取Units(括号内的内容)和Name
    if ($rest -match '\((.*?)\)') {
        $name = $rest -replace '\(.*?\)', '' -trim
        $units = $matches[1] -trim
    } else {
        $name = $rest -trim
        $units = ''
    }
    # 生成自定义对象
    [PSCustomObject]@{
        Num = $num
        Name = $name
        Data = $_.Value
        Units = $units
    }
}

# 排序并输出
$formattedTable | Sort-Object -Property Num | Format-Table -AutoSize

关键说明

  • 使用[PSCustomObject]将哈希表转换为自定义对象,PowerShell会自动识别对象的属性作为表格列。
  • 添加-AutoSize参数可以自动优化列宽,避免内容截断或排版混乱。

内容的提问来源于stack exchange,提问作者Chusé Antón Burillo Arbej

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:22:08