2016-06-07 2 views
1

J'ai un script en cours d'exécution qui reflète deux répertoires et met à jour un fichier journal sur ce qui se passe entre les deux répertoires. Je veux analyser ce fichier journal pour obtenir les mises à jour à mesure qu'elles arrivent (pendant que le script est en cours d'exécution) et je veux que celles-ci m'envoient un courriel de ce qui a changé, comme une notification. Aussi - Je ne veux pas être informé de la même information plus d'une fois si possible?powershell analyse le fichier journal lorsqu'il est mis à jour

Je ne suis pas sûr de la façon dont je le faire de manière après avoir lu certaines des listes de commandes en ligne.

TLDR; vraiment tout ce que je suis à la recherche à faire est quand une ligne est ajoutée au fichier journal, analyser le fichier pour obtenir la ligne mise à jour, sans obtenir des autres lignes.

Pas si fort avec PowerShell de sorte que toute aide serait grandement appréciée.

Répondre

2

Vous pouvez demander à PowerShell d'obtenir chaque nouvelle ligne lorsqu'elle est transmise en passant le paramètre -Wait à Get-Content. Vous pouvez ensuite passer dans un scriptblock Foreach-Object pour effectuer toute opération dont vous avez besoin.

Get-Content $logfile -Tail 0 -Wait | foreach { 
    "Another line was added: " + $_ 
} 

L'argument -Tail N fait Get-Content pour obtenir uniquement les dernières lignes N; dans ce cas zéro. Cela l'amène à ignorer tout ce qui se trouve déjà dans le fichier et à transmettre uniquement les lignes nouvellement ajoutées à votre bloc de script.

Remarque: Cette cmdlet continuera de s'exécuter jusqu'à ce que vous l'annuliez avec Ctrl + C (ou arrête son processus PowerShell), ce qui la rend beaucoup plus utile dans une invite interactive que dans un script.

+0

Merci beaucoup, je cherche depuis longtemps pour cela! est-ce que je passerais le script d'email dans le foreach pour l'obtenir pour envoyer chaque nouvelle ligne à moi-même? alors cela enverrait un courriel à chaque ligne comme elle vient à droite? Merci encore! :) – flanelman

+0

Vous devez placer des commandes dans le bloc 'foreach {...}'. A l'intérieur de ce bloc, la variable '$ _' contient la ligne complète qui a été ajoutée. –

+0

alors je devrais écrire "$ _"? comme le corps, comme cela contient la ligne? :) – flanelman