freedom-_-qの勉強履歴

メモ書きが主になるかと思います。勉強強制のために一日一記事目指してます。頭良くないので間違いが多々あるかと思います。

PowerShellのフィルタリング(Where-Object)

はじめに

Pythonを使っていて「内包表記のifでフィルタリングするやり方」が好きで、同様のことがPowerShellでできないか調べた。
その結果Where-Objectを使えばよさそうということが分かった。
使い方の例をいくつか示す。
公式リファレンス

Alias元が"*-Object"であるものを取り出して表示

PS> Get-Alias | Where-Object {$_.Definition -like "*-Object"} | Write-Output

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           compare -> Compare-Object
Alias           diff -> Compare-Object
Alias           foreach -> ForEach-Object
Alias           group -> Group-Object
Alias           measure -> Measure-Object
Alias           select -> Select-Object
Alias           sort -> Sort-Object
Alias           tee -> Tee-Object
Alias           where -> Where-Object

Aliasを使うことで短縮できる。

PS> gal | ? {$_.Definition -like "*-Object"} | echo

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           compare -> Compare-Object
Alias           diff -> Compare-Object
Alias           foreach -> ForEach-Object
Alias           group -> Group-Object
Alias           measure -> Measure-Object
Alias           select -> Select-Object
Alias           sort -> Sort-Object
Alias           tee -> Tee-Object
Alias           where -> Where-Object

1~100の中で偶数のみ取得

出力行数が多いから selectで前後3つのみ表示している。

PS > 1..100 | ? {$_ % 2 -eq 0} | select -Last 3 -First 3
2
4
6
96
98
100

これくらいならWhere-Object使わんでもできる。

PS > 1..50 | % {$_*2} | select -Last 3 -First 3
2
4
6
96
98
100

"Get-*"とマッチするコマンドレットの表示

こちらも前後3つのみ表示している。

PS > Get-Command | ? {$_.CommandType -eq "Cmdlet" -and $_.Name -like "Get-*" } | select -Last 3 -First 3

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-Acl                                            3.0.0.0    Microsoft.PowerShell.Security
Cmdlet          Get-Alias                                          3.1.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-AppxDefaultVolume                              2.0.1.0    Appx
Cmdlet          Get-WmiObject                                      3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Get-WSManCredSSP                                   3.0.0.0    Microsoft.WSMan.Management
Cmdlet          Get-WSManInstance                                  3.0.0.0    Microsoft.WSMan.Management

若干長くなってしまうが、以下の書き方もできる。
and条件が多い場合はこちらで適宜改行入れたほうが見やすいかも。

PS > Get-Command |
    ? -Property CommandType -eq "Cmdlet" |
    ? -Property Name -like "Get-*"  |
    select -Last 3 -First 3

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-Acl                                            3.0.0.0    Microsoft.PowerShell.Security
Cmdlet          Get-Alias                                          3.1.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-AppxDefaultVolume                              2.0.1.0    Appx
Cmdlet          Get-WmiObject                                      3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Get-WSManCredSSP                                   3.0.0.0    Microsoft.WSMan.Management
Cmdlet          Get-WSManInstance                                  3.0.0.0    Microsoft.WSMan.Management

メモリ使用量200MB以上を降順で表示

PS > Get-Process | ? -Property PM -gt 200MB | sort -Descending -Property PM

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
      0       0   683448     682052              9420   0 vmmem
    947      73   614248     345236   1,911.63   5380   1 chrome
    445      31   477068     522688   1,258.13  11276   1 chrome
   2898      39   350512     189268              6548   0 mysqld
    667      37   321896     117068     535.56   8948   1 nvcontainer
    611      35   282616     138604       1.39  13840   1 steamwebhelper
    395      25   268624     324724     502.52  17852   1 chrome

やっぱChromeさんメモリ食いやな。