【powershell】テキストのGrep (Select-String )
sakuraエディタのGrepは手放せないものの一つであるが、もう少しシビアな環境(出先のサーバとか、サードパーティアプリケーションのインストールがポリシーで許可されていない環境など)でGrepするにはどうすれば良いかを探ってみた。
目次
本文
1. GrepならSelect-String(SLS)でしょ
# 単なるGrep例 Select-String -Pattern "Invoke-Web" -Encoding default -Path "*.ps1" # ※カレントフォルダのみ。サブフォルダをリカーシブに検索はしてくれない。
2. サブフォルダも検索対象とする場合、Get-ChileItemを使用
# 記法1 $a = Get-ChildItem -Recurse -Path "D:\Git" -Filter *.ps1 $a | Select-String -Pattern "Invoke-Web" -Encoding default # ※もちろん1行で書いてもOK
もう一つの書き方。
# 記法2 Select-String -Pattern "Invoke-Web" -Encoding default -Path (Get-ChildItem -Recurse D:\Git -Filter "*.ps1")
<結果例>
Git\a_powershell\get-issue-FromRedmine.ps1:18: $a = Invoke-WebRequest $url -Headers $headers -Method GET -ContentType 'application/json' Git\a_powershell\get-projects-FromRedmine.ps1:6:$a = Invoke-WebRequest $url -Headers $headers -Method GET -ContentType 'application/json' Git\a_powershell\get-queries-FromRedmine.ps1:14: $a = Invoke-WebRequest $url -Headers $headers -Method GET -ContentType 'application/json' Git\a_powershell\get-users-FromRedmine.ps1:17: $a = Invoke-WebRequest $url -Headers $headers -Method GET -ContentType 'application/json'
3. 対象となるファイルのフルパスのみを取得
残念なことにSelect-String はオブジェクト返却ではない数少ないコマンドレット。
自分で出力結果を加工する旧来のLinuxコマンドのようなことをしなくてはいけない。
# サンプル $b = Get-ChildItem -Recurse -Path "D:\Git" -Filter *.ps1 | SLS -Pattern "Invoke-Web" -Encoding default $b | %{JOIN-PATH ($_.ToString().Split(":")[0] + ":") $_.ToString().Split(":")[1]}
どうやら、結果を":"でsplitにかけると[0]にドライブレター、[1]にそれ以降のパスが格納されるようなのでJOIN-PATHで結合(恐らく、「D:\xxx\xxx.ps1」が「:」でsplitされてしまっているのだろう)。
<結果例>
D:\Git\a_powershell\get-issue-FromRedmine.ps1 D:\Git\a_powershell\get-projects-FromRedmine.ps1 D:\Git\a_powershell\get-queries-FromRedmine.ps1 D:\Git\a_powershell\get-users-FromRedmine.ps1
あとは、この情報を煮るなり焼くなりご自由に。
バージョン情報
> $PSVersionTable Name Value ---- ----- PSVersion 5.1.19041.1023