PowerShell 格式化系统完全掌握(下):自定义列/格式字符串/对齐与宽度 + 实战模板
文章目录
- PowerShell 格式化系统完全掌握(下):自定义列/格式字符串/对齐与宽度 + 实战模板
- 1. 计算列(Calculated Property):自定义任何一列
- 1.1 示例:显示 VM(MB)并保留两位小数、右对齐
- 1.2 示例:自定义列头并复合表达式
- 2. 列宽与对齐(只对 `Format-Table`)
- 3. 分组与换行:`-GroupBy`、`-Wrap`
- 4. Format right 的“报表模板”
- 4.1 屏幕友好模板(表格)
- 4.2 导出纯文本表格(文件)
- 4.3 导出 HTML 报表(注意不要提前 `Format-*`)
- 4.4 GridView 交互(Win 环境)
- 5. 常见故障排查清单(实战非常好用)
- 6. 进阶:`FormatString` 玩转数字/日期
- 7. 10 题自测(带参考答案)
- 8. 实用场景模板合集(拿去即用)
- 8.1 进程资源 Top 报表(屏幕版)
- 8.2 服务健康快照(HTML 版)
- 8.3 目录清单(宽列表)
- 9. 一页纸总结(收藏级)
PowerShell 格式化系统完全掌握(下):自定义列/格式字符串/对齐与宽度 + 实战模板
本篇定位:在上篇“原理与基础用法”的基础上,带你玩转计算列、格式字符串、对齐/宽度、分组与换行,并给出可直接复用的报表与导出模板。
1. 计算列(Calculated Property):自定义任何一列
语法(Format-Table
/ Format-List
通用):
@{Name = '列头显示名' # 别名:N、Label、LExpression = { 脚本块 } # 别名:E# 还可加:FormatString / Width / Alignment(仅 Format-Table 接收)
}
1.1 示例:显示 VM(MB)并保留两位小数、右对齐
Get-Process |Format-Table Name,@{n='VM (MB)'; e={$_.VM/1MB}; FormatString='F2'; Alignment='Right'} -AutoSize
1.2 示例:自定义列头并复合表达式
Get-Service |Format-Table @{n='ServiceName';e={$_.Name}}, Status, DisplayName -AutoSize
小技巧:
/1MB
、/1GB
这类写法简单直观,常用于把字节转换为人类可读单位。
2. 列宽与对齐(只对 Format-Table
)
Get-Process |Format-Table @{n='Name'; e={$_.Name}; Width=30; Alignment='Left'},@{n='Id'; e={$_.Id}; Width=8; Alignment='Right'} -AutoSize
注:
-AutoSize
会基于数据动态计算宽度;你也可以同时指定固定宽度覆盖默认。导出到文件时记得Out-File -Width 200
,避免换行难看。
3. 分组与换行:-GroupBy
、-Wrap
-GroupBy <Prop>
:按属性分组(记得先Sort-Object
保证分组有序)。-Wrap
:长文本换行显示(例如DisplayName
很长时)。
Get-Service |Sort-Object Status, Name |Format-Table -GroupBy Status Name, Status, DisplayName -Wrap -AutoSize
4. Format right 的“报表模板”
4.1 屏幕友好模板(表格)
# 屏幕展示:紧凑 + 可读
Get-Process |Select-Object Name, Id, VM, WorkingSet |Sort-Object VM -Descending |Format-Table @{n='Name';e={$_.Name};Width=28},@{n='Id';e={$_.Id};Width=6;Alignment='Right'},@{n='VM(MB)';e={$_.VM/1MB};FormatString='F1';Alignment='Right'},@{n='WS(MB)';e={$_.WorkingSet/1MB};FormatString='F1';Alignment='Right'} -AutoSize
4.2 导出纯文本表格(文件)
Get-EventLog -List |Select-Object LogDisplayName, MinimumRetentionDays |Sort-Object LogDisplayName |Format-Table @{n='LogName';e={$_.LogDisplayName};Width=40},@{n='RetDays';e={$_.MinimumRetentionDays};Alignment='Right'} |Out-File .\EventLogs.txt -Width 200
4.3 导出 HTML 报表(注意不要提前 Format-*
)
Get-Service |Select-Object Name, DisplayName, Status |Sort-Object Status, Name |ConvertTo-Html -Title 'Service Report' -PreContent "<h2>Service Report</h2>" |Out-File .\ServiceReport.html
记住:
ConvertTo-Html
要吃“对象”,不是“格式化指令”。所以不要把Format-Table
放在它前面。
4.4 GridView 交互(Win 环境)
Get-Process |Select-Object Name, Id, CPU, VM, WS |Out-GridView -Title 'Process Explorer'
5. 常见故障排查清单(实战非常好用)
-
导出 HTML/CSV 内容怪异?
- 检查是否在
ConvertTo-Html/Export-Csv
之前用了Format-*
。 - 正解:先选择属性(
Select-Object
),再导出。
- 检查是否在
-
Out-GridView 无法显示?
- 检查是否喂了
Format-*
之后的内容。 - 正解:直接把对象传给
Out-GridView
。
- 检查是否喂了
-
表格对齐/换行丑?
-AutoSize
、-Wrap
、自定义Width/Alignment
组合使用。- 导文件加
Out-File -Width N
。
-
混入了多种对象类型导致格式混乱?
- 拆开执行或统一投射成相同结构(
Select-Object
统一属性集合)。
- 拆开执行或统一投射成相同结构(
-
列头不是属性名(例如
PM (K)
)看不懂?- 用
Get-Member
查真实属性;列头只是显示名。
- 用
6. 进阶:FormatString
玩转数字/日期
FormatString
支持 .NET 标准/自定义格式:
Get-Process |Format-Table Name,@{n='CPU(s)'; e={$_.CPU}; FormatString='F2'; Alignment='Right'},@{n='StartTime'; e={$_.StartTime}; FormatString='yyyy-MM-dd HH:mm'} -AutoSize
小贴士:有些属性(如
StartTime
)可能需要管理员权限或存在空值,注意容错:e={ $_.StartTime -as [datetime] }
。
7. 10 题自测(带参考答案)
1)“Format 命令应该放在管道哪里?”
最右侧(或仅在
Out-File/Out-Printer
之前)。
2)Out-GridView
能否接 Format-Table
的输出?
不能。它只接受原始对象。
3)为什么 Get-Process
会显示那几列?
有预定义视图(
.format.ps1xml
)决定了默认列与列头。
4)没有预定义视图时怎么决定显示哪些列?
看
Types.ps1xml
的DefaultDisplayPropertySet
,没有就考虑所有属性。
5)什么时候显示表格,什么时候显示列表?
≤4 列用表格;≥5 列用列表(为了可读性)。
6)如何把字节转换成人类可读单位?
/1KB
、/1MB
、/1GB
等。
7)如何按状态分组显示服务?
Sort-Object Status
+Format-Table -GroupBy Status
。
8)导出到文件时表格被换行了怎么办?
Out-File -Width 200
(或更大)。
9)为何 PM (K)
找不到对应属性?
这是列头显示名,真实属性请用
Get-Member
查看(如PM
)。
10)如何创建“保留两位小数并右对齐”的计算列?
@{n='X'; e={...}; FormatString='F2'; Alignment='Right'}
8. 实用场景模板合集(拿去即用)
8.1 进程资源 Top 报表(屏幕版)
Get-Process |Select-Object Name, Id, CPU, VM, WS |Sort-Object CPU -Descending |Format-Table @{n='Name';e={$_.Name};Width=25},@{n='Id';e={$_.Id};Width=6;Alignment='Right'},@{n='CPU(s)';e={$_.CPU};FormatString='F2';Alignment='Right'},@{n='VM(MB)';e={$_.VM/1MB};FormatString='F1';Alignment='Right'},@{n='WS(MB)';e={$_.WS/1MB};FormatString='F1';Alignment='Right'} -AutoSize
8.2 服务健康快照(HTML 版)
$services = Get-Service |Select-Object Name, DisplayName, Status |Sort-Object Status, Name$services |ConvertTo-Html -Title 'Service Health' `-PreContent "<h2>Service Health Snapshot</h2><p>$(Get-Date)</p>" |Out-File .\ServiceHealth.html
8.3 目录清单(宽列表)
Get-ChildItem C:\Projects -Directory | Format-Wide Name -Column 3
9. 一页纸总结(收藏级)
- 机制:对象 → Out-Default → Out-Host → 格式化系统(视图/默认属性)→ 指令 → 渲染
- 三板斧:
Format-Table
(表格)、Format-List
(多属性/看值)、Format-Wide
(宽列表) - 两大坑:Format right;一次只喂一种对象类型
- 与 Out*:
Out-File
/Out-Printer
接格式化指令;Out-GridView
只能接对象 - 计算列:
@{n='列'; e={...}; FormatString='F2'; Alignment='Right'; Width=30}
- 导出:文件加
-Width
;HTML/CSV 前不要Format-*
到这你已经把“格式化系统”的原理 + 用法 + 实战全部拿下了。
以后看到“输出不好看/导出乱/GridView 不显示”的问题,就按本文清单逐一排查,十拿九稳。