2017-01-18 3 views
2

PowerShellのtype -waitコマンドを使用してログファイルを実際に監視しようとしています。私がLinux上でtail -fを使用するのと同じ方法でWindows上で時刻を取得し、そのファイルを別のコマンド - select-stringgrepなど)にパイプして、条件に基づいてアクションをトリガーしたい。 Linuxでは、私がしようとしていることを達成するためにwatchを使用します。PowerShellのタイプを使用する - select-stringを使用してリアルタイムでアプリケーションログを監視し、条件を実行してアクションを実行する(tail -fやwatchなど)

次の例では、文字列"status=Caught"を含む新しい行がログファイルに書き込まれるたびに、フレーズ"You caught a critter!"を印刷しようとしています。

while (1) {if (type -wait "$env:USERPROFILE\AppData\Roaming\CritterCatcherApp\Logs\CritterBag-170118.log" | select-string -quiet "state=Caught") {write-host "You caught a critter!"} else {continue}} 

select-stringコマンドの引数は-quietTrueを返すことに注意してください。実際には、この例では、ログファイルに文字列"status=Caught"を含む既存の行があるため、最初にコマンドを実行すると、Trueが1回だけ返されます。

私は何とか既存の文字列を見落とす必要があります(または、例えばログファイルを回転させる)が、今は問題は、ファイルの末尾まで続けるだけでなく、ファイルに書き込まれる各行に指定された文字列が含まれているかどうかを評価し続けます。文字列が存在する場合は、行を出力するなどの任意のアクションを実行する必要があります。それ以外の場合は、文字列の受信を継続します。

次のポストは、引数がGet-Contentコマンドレットのオプションであることを示しています。How to monitor a windows log file in real time?。この投稿に記載されているように、がforeachループで動作することを期待する必要があるかどうかはわかりません:In Powershell can i use the select-string -quiet switch within a foreach statement

上記のPowerShellスクリプトを修正して、ログファイルをテールし、指定された文字列で新しい行ごとにアクションを実行し、ファイルの末尾に続けて、書き込まれたときに新しい行を評価できますか?

答えて

1

あなたはWhere-Object (?)ForEach-Object (%)とパイプラインでそれを行うことができます。

Get-Content file -wait | ? { $_ -match "status=Caught" } | % { Write-Host "You caught a critter!" } 

status=Caughtがファイル内で検出されるたびに、ForEach-ObjectWrite-Hostあなたはそれを得た

+0

を実行します - それは動作します。これは確かに答えです。コードの1つの行では、それは洗練された解決策です。ファイルの既存のエントリのために 'Write-Host'出力を数回取得し、それを解決することが次のステップになります。ありがとうございました。 –

関連する問題