PowerShell 格式化系统完全掌握(上):工作原理、默认规则与三大格式化命令
文章目录
- PowerShell 格式化系统完全掌握(上):工作原理、默认规则与三大格式化命令
- 1. 为什么要学格式化?
- 2. 格式化系统是怎么工作的?
- 3. 默认格式的“规则链”
- 3.1 查预定义视图(.format.ps1xml)
- 3.2 没有视图?看默认显示属性(Types.ps1xml)
- 3.3 决定表格还是列表
- 4. 三大格式化命令:你最常用的就这三个
- 4.1 `Format-Table` / `ft`
- 4.2 `Format-List` / `fl`
- 4.3 `Format-Wide` / `fw`
- 5. `Format-*` 与 `Out-*` 的正确姿势
- 6. 两大高频“坑位”
- 6.1 一定要“Format right”
- 6.2 一次只喂一种对象类型
- 7. 动手练习(上)
- 8. 速查表(收藏)
PowerShell 格式化系统完全掌握(上):工作原理、默认规则与三大格式化命令
本篇定位:把第 10 章的核心机制讲透——为什么
Get-Process
会显示那几列、为什么有时是表格有时是列表、Format-Table/Format-List/Format-Wide
到底该怎么用,以及它们和Out-*
的关系。下一篇给你高级玩法与实战模板。
1. 为什么要学格式化?
- PowerShell 的输出本质是对象,默认只展示“看起来最有用”的少数属性。
- 想做报表、导出文件、精确展示,就必须会“格式化”:把对象按你想要的样子展示出来。
2. 格式化系统是怎么工作的?
一条命令如:
Get-Process
在后台发生了这些步骤:
Get-Process
把 System.Diagnostics.Process 对象放进管道。- 管道末端的隐藏命令 Out-Default 接收对象。
Out-Default
把对象交给 Out-Host(默认输出设备是控制台)。Out-Host
发现是“普通对象”,触发格式化子系统来决定“显示哪些列、列名、顺序、宽度”。- 格式化子系统按“规则链”选择展示方案(见下一节),生成格式化指令交回给
Out-Host
,渲染到屏幕。
关键点:真正决定显示样式的是“格式化子系统”,不是产生对象的 cmdlet。
3. 默认格式的“规则链”
当你没显式调用 Format-*
时,系统按以下顺序决定显示:
3.1 查预定义视图(.format.ps1xml)
- PowerShell 内置若干
*.format.ps1xml
(如DotNetTypes.format.ps1xml
)。 - 如果某类型(例如
System.Diagnostics.Process
)有预定义视图,优先按其配置展示(列名、宽度、别名等)。
这也是为什么你看到
PM (K)
这样的列头——它只是显示名,真正的属性叫PM
。属性名以Get-Member
为准。
3.2 没有视图?看默认显示属性(Types.ps1xml)
- 再查
Types.ps1xml
是否有 DefaultDisplayPropertySet。 - 如果有,就显示这组属性;如果没有,就考虑所有属性。
3.3 决定表格还是列表
- ≤ 4 个属性 → 表格(Table)。
- ≥ 5 个属性 → 列表(List)。
- 目的:保证可读性(很多列塞进表格会崩)。
4. 三大格式化命令:你最常用的就这三个
口诀:Format right(格式化命令写在最右侧)——详细原因看后文“常见坑”。
4.1 Format-Table
/ ft
最常用,用于表格展示。
常用参数:
-Property
:指定列(可省略参数名,支持通配符)。-AutoSize
:遍历所有行计算最合适列宽,输出更紧凑(大数据会更慢)。-GroupBy <Prop>
:按某属性分组显示(通常配合Sort-Object
)。-Wrap
:列内容太长时换行,不使用截断...
。
示例:
Get-Process | Format-Table Id, Name, Responding -AutoSize
Get-Service | Sort-Object Status | Format-Table -GroupBy Status -Property Name, Status -AutoSize
Get-Service | Format-Table Name, Status, DisplayName -AutoSize -Wrap
4.2 Format-List
/ fl
用于属性太多时的列表展示,也常用来“看全属性 + 值”。
Get-Service | Format-List * # 看全属性
Get-Process | Format-List Name, Id, VM, WS
4.3 Format-Wide
/ fw
展示单个属性的多列宽表(轻量罗列)。
Get-Process | Format-Wide Name -Column 4
5. Format-*
与 Out-*
的正确姿势
-
Format-*
产生格式化指令,能正确消费这类指令的只有:Out-Host
(默认)Out-File
Out-Printer
-
Out-GridView
不吃格式化指令,它要原始对象(而不是格式化后的指令)。
示例对比:
# 正确:原始对象 → Out-GridView
Get-Process | Out-GridView# 错误:Format 后的“指令”投喂给 Out-GridView(不会工作)
Get-Process | Format-Table | Out-GridView
导出文件需注意宽度:
Get-Process | Format-Table Name, Id -AutoSize | Out-File .\procs.txt -Width 200
6. 两大高频“坑位”
6.1 一定要“Format right”
# 错误示例:Format-Table 后再接其他处理 → 后续拿到的是“格式化指令”,不是对象
Get-Service | Format-Table | ConvertTo-Html | Out-File services.html
**正确写法:**把 Format-*
放到最右(或仅在 Out-File
/ Out-Printer
之前):
Get-Service |Select-Object Name,DisplayName,Status |ConvertTo-Html -Title 'Services' |Out-File services.html
6.2 一次只喂一种对象类型
# 同一输出里混入不同对象类型 → 格式化系统只按第一个类型做样式,后面会很丑
Get-Process; Get-Service
7. 动手练习(上)
1)显示“仅 名称、Id、Responding”的进程表,填满窗口且不截断:
Get-Process | Format-Table Name, Id, Responding -AutoSize -Wrap
2)显示进程表:Name, Id, VM(MB), WS(MB)
(MB为单位):
Get-Process |Format-Table Name, Id,@{n='VM(MB)'; e={$_.VM/1MB}},@{n='WS(MB)'; e={$_.WorkingSet/1MB}} -AutoSize
3)列出可用事件日志,表头用 LogName
、RetDays
:
Get-EventLog -List |Format-Table @{n='LogName';e={$_.LogDisplayName}}, @{n='RetDays';e={$_.MinimumRetentionDays}} -AutoSize
4)服务按状态分组显示:
Get-Service | Sort-Object Status -Descending | Format-Table -GroupBy Status Name, Status
5)把 C 盘根目录下所有目录四列宽列出:
Get-ChildItem C:\ -Directory | Format-Wide Name -Column 4
8. 速查表(收藏)
目标 | 命令 | ||
---|---|---|---|
列表展示少量列 | Format-Table -Property ... [-AutoSize] | ||
展示很多属性或看“属性+值” | Format-List * / Format-List Prop1,Prop2,... | ||
多列罗列单属性 | Format-Wide <Prop> -Column N | ||
分组展示 | `… | Sort-Object | Format-Table -GroupBy ` |
传给 GridView | `对象 | Out-GridView(不要先 Format-*`) | |
导出文件宽度 | `… | Format-Table … | Out-File -Width 200` |
牢记 | Format right;一次只喂一种对象类型 |
下篇(下)我们会进入自定义列/列表、格式字符串、对齐与宽度控制、实战模板(报表/导出),并配套“常见故障排查清单”与“面试级问答”。