この記事は以前にdevslife.comで紹介したものです。
ビルドプロセスがとんでもなく巨大なテキストファイルを吐き出した。これは何かが無限ループしていると思うのだがその原因を突き止めなければいけない。なのでファイルの最後の方を何とかして読む必要がある。600MBもあるテキストファイルの最後のほうだけをどうやって読むことができるだろうか。PowerShellを使ってやってみようと思う。
Get-Contentではどうだろうかと初め考えた。次のようなコードを書いてみた。
$FilePath = "D:\Temp\Test.txt"
$Text = Get-Content -Path $FilePath -TotalCount 1
$Text
これだと初めの一行を読むということだもんね。このログファイルはXMLなのですべてのデータが一行に収まってるから使えない。試しに-TotalCountを-1とか-2とかにしたら後ろから読んでくれるかな?と思ってやってみたら全部読み込まれてしまった。ヘルプを読んでみると-1はデフォルトの値ですべてを読み込むという意味らしい。-2にしても無駄だった。まあできたとしても今回の問題については意味のないことだ。
ちなみに-ReadCountというパラメータもあるのだがこれも使えない。これは何行読んだら画面に表示してくれというのに使うらしい。大きなファイルを読むには使えそうだが、結局は早すぎて読めんだろ。これで既存のCmdletを使用した方法はあきらめることにした。
試行錯誤の末、下のようなPowerShellスクリプトで最後の1024バイトを読み込むことに成功。
$TextFilePath = "D:\Temp\MechaDekaFairu.txt"
$BytesToRead = 1024
$fs = [System.IO.File]::OpenRead($TextFilePath)
$fs.Position = $fs.Length - $BytesToRead
$sr = New-Object System.IO.StreamReader($fs)
$text = $sr.ReadToEnd()
$sr.Close()
$fs.Close()
$text
適当に$TextFilePathと$BytesToReadの値を変えると表示されるテキストファイルやその量を調節できます。もっと変えるといろんなところをのぞけそうです。一応PowerShell.exeのメモリが肥大することなく無事終了しました。
更新:使えると思ったのでニュースグループにも英語で書いておきました。ここから。
コメント
.NET Frameworkを利用可能なシェルだからこそ、なせる技ですよね。
既存のコマンドレットがだめなら、.NET Framework使っちゃおうみたいな。
これ、ちょっとカスタマイズして関数化しても良さそうですね。
にしても、英語でさらっと投稿できるあたりがうらやましいです。
確かに.NET Frameworkを直接使えてしまうところは最強ですよね。
それを実感するには.NET Frameworkを使ったことのある人じゃないと有り難みが分からないのではと思います。
C#やVB .NETそしてPowerShellを使うにしても.NET Frameworkをベースにしている訳ですからそっちの勉強
がおろそかになってはいけないんですよね。
そうですね。 VB.NETやC#で開発経験がある方でないと、理解しがたいし、ありがたみはわからないかもしれませんね。
このサイトで、その辺も含めて記事を書いていけたらいいですね。