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さんメモリ食いやな。