2017-01-18 3 views
2

J'essaie d'utiliser la commande type -wait de PowerShell pour surveiller un fichier journal en réel temps sur Windows de la même manière que j'utiliser tail -f sur Linux, et je veux siffler le fichier à une autre commande - select-string, comme grep - qui déclenchera une action fondée sur une condition. Sous Linux, j'utiliserais watch pour accomplir ce que j'essaye de faire.Utilisez le type de PowerShell -wait avec select-string pour surveiller en temps réel un journal d'application pour une condition et exécuter une action (comme tail -f ou watch)

Dans l'exemple suivant, j'essaie d'imprimer la phrase "You caught a critter!" chaque fois qu'une nouvelle ligne contenant la chaîne "status=Caught" est écrite dans le fichier journal.

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}} 

S'il vous plaît noter que l'argument -quiet pour la commande retourne select-stringTrue. En fait, dans cet exemple, il ne retourne que True une fois, quand j'exécutez la commande, comme le fichier journal a des lignes existantes qui contiennent la chaîne "status=Caught". Je dois en quelque sorte ignorer les chaînes existantes (ou, par exemple, faire pivoter les fichiers journaux), mais en ce moment, le problème est que j'ai besoin du script PowerShell pour non seulement continuer à terminer le fichier, mais j'ai aussi besoin pour continuer à évaluer si chaque nouvelle ligne écrite dans le fichier contient la chaîne donnée. Ensuite, si la chaîne est présente, j'ai besoin d'exécuter une action arbitraire, comme imprimer une ligne; Sinon, continuez d'écouter la chaîne.

La publication suivante indique que l'argument -wait est une option pour la cmdlet Get-Content: How to monitor a windows log file in real time?. Je ne sais pas si je devrais attendre -wait de travailler avec une boucle foreach, comme décrit dans ce post: In Powershell can i use the select-string -quiet switch within a foreach statement. Comment puis-je modifier le script PowerShell ci-dessus pour terminer un fichier journal et exécuter une action pour chaque nouvelle ligne avec une chaîne donnée, et continuer à terminer le fichier et évaluer les nouvelles lignes comme ils sont écrits?

Répondre

1

Vous pouvez le faire sur le pipeline avec Where-Object (?) et ForEach-Object (%):

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

Chaque fois status=Caught est détecté dans le fichier, le Write-Host dans le ForEach-Object exécutera

+0

Vous l'avez - Il fonctionne. C'est à coup sûr la réponse, et pour une ligne de code totale, c'est une solution élégante. Je reçois la sortie 'Write-Host' à plusieurs reprises en raison des entrées existantes dans le fichier, et la résolution de ce sera la prochaine étape que je prends. Je vous remercie. –