对象
当powershell运行任意命令时, 会在内存中完全构造用于容纳所有信息的表格。 表的概念包含:
- 对象, 即表行, 代表单个事物, 比如单个进程或者单个服务。
- 属性, 即表列, 代表关于对象的一部分信息, 比如进程名称, 进程ID或者服务状态
- 方法, 方法与某个对象关联, 并使对象完成某些任务, 比如杀死进程或者启动服务
- 集合, 整个对象的集合。 即'表'本身
powershell 中对象会使对计算机的管理更加简单, 在linux中, 需要频繁使用
grep
,awk
,sed
等命令用于处理字符串。 powershell中使用对象消除所有的文本操作开销, 因为可以直接提取对象的属性。
探索对象
在任何产生输出的命令后面使用Get-Member
(简写gm), 可以查看输出对象的属性。
Get-Process | gm
TypeName:System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize64
PM AliasProperty PM = PagedMemorySize64
SI AliasProperty SI = SessionId
VM AliasProperty VM = VirtualMemorySize64
WS AliasProperty WS = WorkingSet64
Disposed Event System.EventHandler Disposed(System.Object, System.EventArgs)
ErrorDataReceived Event System.Diagnostics.DataReceivedEventHandler ErrorDataReceived(System.Objec...
Exited Event System.EventHandler Exited(System.Object, System.EventArgs)
OutputDataReceived Event System.Diagnostics.DataReceivedEventHandler OutputDataReceived(System.Obje...
BeginErrorReadLine Method void BeginErrorReadLine()
使用gm
查看对象的属性时,可以看到有一些不同种类的属性
- Property
- NoteProperty
- Method
- Event
- AliasProperty
属性使对象有更好的一致性, 比如为原生只有类似ProcessName
属性的对象添加Name
属性。 不同类型的属性使用的方法都相同。
属性用于描述对象的某些方面, 通常是只读的, 比如无法修改进程的名字。
对象的排序
大部分cmdlets以确定性的方式产生对象, 每次运行命令都会以相同的顺序产生对象。 例如服务和进程都按照字母表的顺序进行排序, 事件日志倾向于按照事件排序。 指定排序的属性, 可以使用Sort-Object
。例如按照CPU使用倒序排序进程
Get-Process | Sort-Object CPU -Descending
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
286 13 7644 15440 241.78 9208 0 audiodg
1230 109 78932 81948 184.94 15864 3 steam
3247 132 192688 238204 126.95 14556 3 explorer
889 55 28536 99500 119.27 1968 3 steamwebhelper
1310 118 125700 160616 113.80 16072 3 YoudaoNote
按照内存使用倒序排序,如果两个进程内存使用率相同,按照进程ID排序
Get-Process | Sort-Object VM,ID -Descending
只输出指定的属性
Get-Process | Sort-Object VM,ID -Descending | Select-Object VM,CPU,ProcessName
VM CPU ProcessName
-- --- -----------
2239286448128 4.6875 SearchHost
2207729041408 svchost
2206181048320 0.515625 dllhost
2205073539072 24.390625 PowerToys.PowerLauncher
2204455677952 1.65625 PowerToys.ColorPickerUI
2204347355136 128.453125 explorer
2204224503808 7.265625 WsaClient
2204109934592 1.015625 PowerToys.Awake
2204046614528 33.875 powershell
2204001726464 29.109375 WindowsTerminal
人们经常会将 Select-Object 和 Where-Object 这两个PowerShell命令搞混,虽然目前你还没有见过 Where-Object 。 Select-Object 用于选择所需的属性(或列),还可以选择输出行的任意子集(使用 -First 和 -Last )。 Where-object 基于筛选条件从管道中移除或过滤对象。