Заметки о Windows и других программных продуктах Microsoft...

Отслеживаем изменения файла в реальном времени

Отслеживаем изменения файла в реальном времени

Предположим, у вас возникла необходимость отследить в режиме реального времени изменения в текстовом файле, например в логе веб-сервера. В операционных системах Linux для этой цели есть замечательная утилита Tail, которая умеет показывать текущие изменения в текстовом файле. А есть ли что нибудь похожее в Windows?

Конечно есть. Ведь в Windows есть PowerShell, с помощью которого можно решить практически любую задачу. Для вывода содержимого файла в PowerShell используем командлет Get-Content с двумя интересными параметрами:

-Wait — при использовании этого параметра команда не завершает свою работу после вывода содержимого файла, а каждую секунду проверяет файл на наличие изменений и при добавлении новых строк выводит их;
-Tail — количество строк в файле, начиная с конца, которые надо вывести. Например -Tail 10 вернет последние 10 строк файла. Если в качестве значения поставить 0, то будут выводиться все новые строки. Вместо -Tail можно использовать его алиас -Last;

Таким образом для отслеживания изменений файла в реальном времени можно использовать такую команду:

Get-Content test.txt -Wait -Tail 0

запуск команды tail

 

Команда запускается и ждет, а при появлении в файле новых строк немедленно выводит их на экран. Для прекращения работы команды надо нажать Ctrl+C или просто закрыть консоль.

вывод команды tail

 
 
Комментарии

Спасибо! Очень крутая связка! Обязательно найду применение в работе

Можно также использовать в Windows службы для этой цели. Создать новую на C# (FileSystemWatcher и тд) и в реальном времени отслеживать даже не файлы, а целые диски. Что интересно, в отличие от подобного процесса, служба совсем не напрягает компьютер. По крайне мере, в диспетчере задач этого не заметно 🙂

Ага, только ничего сделать с прочтёнными новыми строками нельзя, потому что процесс занят только чтением и построчно передавать данные для обработки нет возможности.

Ответить