PowerShell 面向对象的命令行

PowerShell 与传统命令行(如 CMD 或 Bash)最大的区别在于:PowerShell 的命令输出是对象,而不是纯文本。

PowerShell 比起传统命令行更加灵活、强大,也让脚本编写和系统管理更加高效。

什么是"对象导向命令行"

在传统命令行中,命令之间通过管道 | 传递的是字符串文本,要想进一步处理这些文本,通常需要借助 grep、awk、sed 等工具。

而在 PowerShell 中,命令之间通过管道传递的是对象,可以直接访问对象的属性和方法,无需解析文本,大大提高了准确性和开发效率。

命令输出的是对象

Get-Process 命令为例:

Get-Process

该命令用于获取当前系统中运行的进程列表。

Get-Process 命令返回的并不是纯文本表格,而是一组 .NET 对象,每个进程是一个 System.Diagnostics.Process 类型的对象。

我们可以像访问编程语言中的对象那样访问其属性,例如:

(Get-Process)[0].Name

上述命令表示获取第一个进程的名称,输出示例:

explorer

查看对象的结构:Get-Member

要深入理解对象,关键在于掌握它有哪些属性和方法。PowerShell 提供了 Get-Member 命令来帮助我们探索对象结构:

Get-Process | Get-Member

部分输出示例:

Name        MemberType   Definition
----        ----------   ----------
Id          Property     int Id {get;}
Name        Property     string Name {get;}
Kill        Method       void Kill()
Start       Method       void Start()

说明:

  • Property 表示对象的属性,如 IdName
  • Method 表示对象的方法,如 Kill()Start()

你可以通过 对象.属性对象.方法() 的形式使用这些成员。


对象管道传递

管道传递的是对象

在 PowerShell 中,多个命令通过 | 连接时,传递的是对象而非文本。
这意味着你可以在后续命令中直接访问前一个命令传递的对象属性。

示例:筛选所有状态为 Running 的服务:

Get-Service | Where-Object { $_.Status -eq 'Running' }

解释:

  • $_ 表示当前管道中的对象
  • Status 是服务对象的一个属性

管道操作流程图(Mermaid)


常用对象处理命令

PowerShell 提供了一系列用于操作对象的内置命令,常用于筛选、排序、分组、导出等场景:

命令 作用说明
Where-Object 条件筛选对象
Select-Object 选择或重命名对象属性
Sort-Object 根据某个属性对对象排序
Group-Object 按属性对对象进行分组统计
Measure-Object 统计对象数量、总和、平均等
Export-Csv 将对象导出为 CSV 文件
ConvertTo-Json 将对象转换为 JSON 格式字符串

对象属性筛选与计算列

选择特定属性

Get-Process | Select-Object Name, Id, CPU

该命令提取每个进程的名称、ID 和 CPU 使用情况。

添加计算列(自定义属性)

你可以通过脚本块添加自定义属性:

Get-Process | Select-Object Name, @{Name="MemoryMB";Expression={$_.WorkingSet / 1MB -as [int]}}

说明:

  • @{} 创建一个哈希表定义新属性
  • Name 指定新列名称
  • Expression 提供计算逻辑

排序与分组操作

对进程按 CPU 使用率排序

Get-Process | Sort-Object CPU -Descending

按服务状态分组

Get-Service | Group-Object Status

输出示例:

Count Name                      Group
----- ----                      -----
   75 Running                   {WinDefend, WSearch, ...}
   35 Stopped                   {Fax, Spooler, ...}

导出与结构化数据

导出为 CSV 文件

Get-Service | Select-Object Name, Status | Export-Csv -Path services.csv -NoTypeInformation

转换为 JSON 格式

Get-Service | ConvertTo-Json

这些格式便于与其他系统或 API 进行集成,是自动化工作流的重要部分。


典型实用案例

案例 1:查找最耗 CPU 的前 5 个进程

Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name, CPU

案例 2:按服务状态统计数量

Get-Service | Group-Object Status | Select-Object Name, Count

小结与建议

PowerShell 的面向对象特性,使得命令行操作更符合程序设计思维。通过对象的属性和方法,用户可以更精准地操作系统资源,构建更强大和可靠的自动化脚本。

初学者建议从以下几个方面入手巩固:

  1. 多使用 Get-Member 探索对象结构
  2. 熟练掌握 Where-ObjectSelect-Object 的用法
  3. 尝试使用 Group-ObjectSort-Object 处理数据
  4. 尝试将命令结果导出为 CSV 或 JSON 文件