iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
自我挑戰組

Powershell 入门系列 第 4

Powershell 入门之命令的输出

在命令的执行过程中,我们可能需要需要一些方式,使我们命令的输出更加友好;去除一些没有用的信息,只显示我们所关注的信息。今天我们就来看看,怎么处理命令的输出,使其更加友好。

当我们在系统中运行 Get-Process 时,默认情况下会显示所有的进程,这个结果可能很长,并且我们也不关心所有的进程,有些时候,我们只关注 CPU 或 Memory 使用率靠前的进程:

PS C:\Users\Administrator> Get-Process

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    252      15     4300      15772       0.06   4160   2 backgroundTaskHost
    255      14     4136      17680       0.06   4800   2 conhost
    325      13     2216       5156       0.09    456   0 csrss
    160       9     2532       5152       0.13    532   1 csrss
    273      12     2312       5180       0.16   2456   2 csrss
    373      15     3508      14904       0.08   3756   2 ctfmon
    536      21    15968      35604       0.09    988   1 dwm
    593      28    15368      54028       0.22   2820   2 dwm
   1620      59    23860      81840       1.69   3328   2 explorer
   ............
   ............

我们可以通过我们前面学的管道,对结果进行排序,并只显示前 10 个:
通过 sort 对结果进行排序,通过 -Property 指定基于那个属性排序 ,默认排序方式为升序(从小到大),所以需要使用 -Descending 参数设置为降序;然后再通过 Select-Object 选择前 10 个;

PS C:\Users\Administrator> Get-Process | sort -Property CPU -Descending | Select-Object -First 10

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
   1983     103    68748      81336      25.67   1316   0 svchost
    749      81   199752     121676       7.42   2144   0 MsMpEng
   1772       0      192        144       3.69      4   0 System
    352      18     5272      17300       3.36   3852   0 svchost
   1452      56    21412      81264       1.83   3328   2 explorer
      0      14     7516      21204       1.81     88   0 Registry
    502      32    92088     112884       1.50   4472   2 ServerManager
    640      22    18532      29772       1.28    812   0 svchost
    637      29    63948      77592       1.28   4780   2 powershell
    513      23    15120      30184       0.88   1980   0 svchost

命令输出的某些列参数,是我们不关心的,我们可以通过 Format-Table 只显示我们关心的列:

PS C:\Users\Administrator> Get-Process | sort -Property CPU -Descending | Select-Object -First 10 | Format-Table ProcessName,id,CPU

ProcessName       Id       CPU
-----------       --       ---
TiWorker        4512 34.046875
svchost         1316 26.578125
MsMpEng         2144 23.671875
System             4    7.4375
CompatTelRunner 4156  3.578125
svchost         3852  3.359375
Registry          88  1.921875
explorer        3328     1.875
powershell      4780  1.578125
ServerManager   4472    1.5625

除了上面的表格形式输出,我们还可以使用列表的方式输出:

PS C:\Users\Administrator> Get-Process | sort -Property CPU -Descending | Select-Object -First 10 | Format-List


Id      : 1316
Handles : 1952
CPU     : 27.296875
SI      : 0
Name    : svchost

Id      : 2144
Handles : 744
CPU     : 24.28125
SI      : 0
Name    : MsMpEng

Id      : 4
Handles : 1748
CPU     : 7.828125
SI      : 0
Name    : System

Id      : 3852
Handles : 349
CPU     : 3.359375
SI      : 0
Name    : svchost

Id      : 812
Handles : 645
CPU     : 2.4375
SI      : 0
Name    : svchost

Id      : 88
Handles : 0
CPU     : 1.984375
SI      : 0
Name    : Registry

Id      : 3328
Handles : 1440
CPU     : 1.875
SI      : 2
Name    : explorer

Id      : 4780
Handles : 799
CPU     : 1.78125
SI      : 2
Name    : powershell

Id      : 4472
Handles : 497
CPU     : 1.65625
SI      : 2
Name    : ServerManager

Id      : 1980
Handles : 529
CPU     : 0.9375
SI      : 0
Name    : svchost

现在,我们所看的结果都是以 key 和 value 的形式存在的。在后面写脚本时,我们有需求只需要 value,并赋值给变量,不需要 key,应该怎么实现呢?

我们来看一下,值显示 CPU 使用率最高的那个进程的 ID:

PS C:\Users\Administrator> Get-Process | sort -Property CPU -Descending | Select-Object -First 1 | Select-Object id

  Id
  --
1316

PS C:\Users\Administrator> Get-Process | sort -Property CPU -Descending | Select-Object -First 1 | Select-Object id | ForEach-Object {$_.id}
1316

上一篇
Powershell 入门之管道和文件重定向
下一篇
Powershell 远程连接
系列文
Powershell 入门21

尚未有邦友留言

立即登入留言