この例はテキストファイルにしか有効ではないことを初めに断っておく。当たり前といえば当たり前なのだが。ある文字列を含むファイルを探すことはPowerShellだと一行で済んでしまう。二通り試してみたのでどちらも紹介することにしよう。
【例1】
dir -filter *.cs -recurse | where {(Get-Content $_.FullName) -match "検索文字"}
この後にさらにパイプを追加してやればコピーしたり、削除したり、リストにしたりいろいろ加工できる。例えば| foreach {notepad $_.FullName}とするとそのファイルをメモ帳で開いてくれるのだ。結果が多い場合には多分notepadのプロセスが何十個いや何百個にもなってしまいそうなので注意。
【例2】
dir -filter *.cs -recurse | where {$fs = $_.OpenRead(); `
$sr = New-Object System.IO.StreamReader($fs);$sr.ReadToEnd() -match "検索文字"}
この例はより長く読みにくいけど、例1よりずっと早かった。どうしてだろう?解明するにはGet-Contentの仕組みを理解する必要があるようだ。後で見てみることにしよう。

最近のコメント