当前位置: 首页 > news >正文

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

在后台发生了这些步骤:

  1. Get-ProcessSystem.Diagnostics.Process 对象放进管道。
  2. 管道末端的隐藏命令 Out-Default 接收对象。
  3. Out-Default 把对象交给 Out-Host(默认输出设备是控制台)。
  4. Out-Host 发现是“普通对象”,触发格式化子系统来决定“显示哪些列、列名、顺序、宽度”。
  5. 格式化子系统按“规则链”选择展示方案(见下一节),生成格式化指令交回给 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)列出可用事件日志,表头用 LogNameRetDays

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;一次只喂一种对象类型

下篇(下)我们会进入自定义列/列表、格式字符串、对齐与宽度控制、实战模板(报表/导出),并配套“常见故障排查清单”与“面试级问答”。

http://www.lryc.cn/news/622473.html

相关文章:

  • 【数据分享】上市公司创新韧性数据(2007-2023)
  • 数据处理分析环境搭建+Numpy使用教程
  • MySQL、PolarDB、PolarDB-X、TableStore、MongoDB、TiDB、ClickHouse选型
  • CIAIE 2025上海汽车内外饰展观察:从美学到功能的产业跃迁
  • 中级统计师-会计学基础知识-第一章 账户与复试记账
  • imx6ull-驱动开发篇25——Linux 中断上半部/下半部
  • 嵌入式学习 day52 IMX6ULL裸机开发-I2C
  • Redis核心应用场景及代码案例
  • WordPress 7B2主题,在使用PHP 8.0+出现502的解决办法。
  • 【机器学习深度学习】OpenCompass 评测指标全解析:让大模型评估更科学
  • platform总线注册流程分析
  • 洛谷 P2842 纸币问题 1 -普及-
  • C++类与对象核心知识点全解析(下)
  • 模板方法模式C++
  • 机器翻译:模型微调(Fine-tuning)与调优详解
  • JavaWeb开发_Day13
  • vue3相关基础
  • MySQL知识解析
  • linux-----------------锁
  • week1-[一维数组]传送
  • 【Spring框架】SpringAOP
  • 六大主流负载均衡算法
  • Java项目基本流程(四)
  • Python day45
  • lcm通信库介绍与使用指南
  • 【121页PPT】锂膜产业MESERP方案规划建议(附下载方式)
  • 【学习嵌入式day-25-线程】
  • 华测科技的3D GPR数据分析
  • 前瞻性技术驱动,枫清科技助力制造企业借助大模型完成生产力转化
  • 2025戴尔科技峰会:破局者的力量与智慧