tech.guitarrapc.cóm

Technical updates

PowerShellでtail -fを再現する

PowerShellで毎日いじられてます。 悔しいことが多いのがアレですが、負けません。 さて、今回は最近はやり?のbashネタです。 某LINQ星人にPowerShell 3.0ならできるはず!と言われ、初めて気付き大変不覚の致すところです。 では早速。

tail -fって何

このサイトを見る人は、PowerShellに興味がある人かと思います。 つまり、Shellに興味があるかMS系技術に興味があるか……、ShellならGNUでとかも触ってそうですね。 tail -f をもし知らない方がいらっしゃったらこちらをどうぞ。
【 tail 】 ファイルの末尾を表示する
ようは、ファイルの監視です。
-f, --follow ファイルの内容を常に監視し、表示を更新する
このコマンドで、ログファイルの更新を監視するとか、良くやる手段ですね。

Windowsでtail -fはないの?

cmdやPowerShell 2.0までは、標準シェル環境ではtail -fに該当するコマンドはありませんでした。 その辺のエディタを使うのが良くあった方法かと思います。 しかし、PowerShell 3.0からは可能になりました。 コマンドもファイル読み込みのGet-Contentのまま、新たに-tail パラメータが追加されたという素敵仕様です。 正直コマンドを増やすよりは、パラメータの追加の方が嬉しいのは私だけでしょうか。

PowerShellでtail -fでする

PowerShell で tail -fするには以下のコマンドをPowerShell.exeやPowerShell_ISE.exe上で実行します。
Get-Content -Path "ファイルパス" -Wait -Tail "読み取り行数"
入力例:
Get-Content .\test.log -Wait -Tail 10
このようにすると、以下のコマンドで、ファイルが更新されるたびに、画面が読み取り更新されます。 ※5秒お気にGet-Processを実行して./test.logに追記しています。
1..100 | %{Get-Process | Out-File ./test.log -Append; sleep 5}

注意

-Tail は末尾から何行という指示ですが、-Wait で更新を待機しているため、実質全行読み取ります。 そのため、以下としてもほぼ変わりません。
Get-Content .\test.log -Wait -Tail 1
違いがあるとすれば、「初めて読み取った時に、元々ファイルに書き込まれていた末尾から何行読み取ってから待機するか」程度です。 あー、悔しかった。