PowerShell 笔记 - 对象

对象

当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 基于筛选条件从管道中移除或过滤对象。

posted @ 2022-05-21 13:41  Chinor  阅读(167)  评论(0编辑  收藏  举报