2017-07-13 2 views
3

Ich versuche, neue Zeilen, die zu einer Protokolldatei hinzugefügt wurden, zu straffen, wenn sie ein bestimmtes Wort enthalten - siehe "Slack", wenn ich Fehler habe.Powershell Neue Zeilen an Slack senden

Was ich gehofft funktionieren würde, ist:

$message = Get-Content '\\path\to\file.log' -Wait -Tail 0 | Select-String -Pattern 'ERROR' 

foreach($line in $message) { Send-SlackMsg -Text "$($line)" -Channel $channel } 

Leider nicht. Ich habe Send-SlackMsg durch Write-Host ersetzt, nur um zu sehen, ob das das Problem ist, aber nicht.

Get-Content '\\path\to\file.log' -Wait -Tail 0 | Select-String -Pattern 'ERROR' 

Funktioniert wie ein Charme in meiner Konsole.

Wie kann ich PowerShell veranlassen, eine Aktion auszuführen, wenn eine neue Zeile angezeigt wird und mit dem Muster übereinstimmt?

+1

Verwenden Sie '| ForEach-Object {...}' nach 'Select-String' anstelle von' $ message' - sonst wird die erste Zeile wegen des '-Wait'-Schalters –

+0

And immer blockieren Was ist die Var, die die neue Linie darstellt? $ line hat nicht funktioniert. –

+0

Mit einem 'ForEach-Object' wird das aktuelle Element in der Pipeline durch' $ _' dargestellt. –

Antwort

2

Per dem Kommentar von Mathias, könnten Sie ForEach-Object verwenden:

Get-Content '\\path\to\file.log' -Wait -Tail 0 | Select-String -Pattern 'ERROR' | ForEach-Object { Send-SlackMsg -Text $_ -Channel $channel } 

Das Problem mit Ihrem Code war, dass wegen des -Wait Schalters wurde der Code nie über die Linie $message = fortfahren. ForEach-Object verarbeitet jedoch Objekte über die Pipeline, so dass, sobald eine neue Zeile in die Datei geschrieben wird, die mit 'ERROR' übereinstimmt, die Pipeline an die Adresse ForEach-Object weitergeleitet wird.

Verwandte Themen