Как контролировать папку Windows на наличие новых файлов и действовать — CloudSavvy IT

Файлы постоянно меняются в любой операционной системе. Иногда они создаются, иногда они удаляются, иногда они меняются, и это все обычные вещи для операционной системы. Иногда, когда файл изменяется, это может вызвать нестабильность в другом приложении, которое зависит от него, например, изменение номера порта в файле свойств, параметра в манифесте развертывания или даже исправление кода в рабочей среде без прохождения контроля над исходным кодом.

В рамках управления этими операционными системами инженерам нужен способ наблюдать за тем, что происходит с этими критическими файлами, и принимать меры, когда что-то происходит. Войдите в .NET Класс FileSystemWatcher и PowerShell.

В .NET и .NET Core FileSystemWatcher — это класс, который живет в System.IO Пространство имен и контролирует файлы. В PowerShell это может быть очень полезно, особенно в сочетании с другими функциями PowerShell.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Создание FileSystemWatcher

Создайте этот класс в PowerShell, запустив $watcher = New-Object System.IO.FileSystemWatcher, Как только вы это сделаете, вам нужно будет указать, какую папку смотреть. Вы делаете это, устанавливая Дорожка Параметр объекта FileSystemWatcher указывает путь к папке, которую вы хотите просмотреть. Если у вас в Windows есть папка WatchThisFolder под C: вы должны установить FileSystemWatcher для этого, запустив $watcher.Path = 'C:WatchThisFolder',

Поскольку этот класс также находится в .NET Core, вы можете делать все это в системе Linux или Mac OS так же, как в системе Windows. Например, если у вас в Ubuntu Linux есть папка с именем WatchThisFolder под вашим текущим каталогом пользователя, вы бы запустить $watcher.Path = '/home/ubuntu/WatchThisFolder',

Остальные примеры кода в этой статье работают на любой платформе без каких-либо изменений.

Запуск событий из FileSystemWatcher

Теперь, когда у вас есть новый объект FileSystemWatcher, вы можете заглянуть внутрь и попытаться выяснить это. Чтобы увидеть конкретные типы событий файловой системы, за которыми следит FileSystemWatcher, введите $watcher | Get-Member -MemberType Event, Get-Member показывает все, что содержит переданный объект, и, добавив фильтр MemberType, вы можете увидеть определенную категорию, в данном случае, события.

Эти события:

  • Изменено
  • созданный
  • Исключен
  • расположенный
  • ошибка
  • переименованный

Когда одно или несколько из этих событий FileSystemWatcher обнаруживаются по пути, который объект должен наблюдать, объект-наблюдатель вызывает внешнее событие, для которого вы можете определить действия.

Теперь, когда объект-наблюдатель знает, что смотреть, и вы знаете, на какие события он смотрит, вы должны установить его, чтобы вызвать событие при обнаружении действия. Сделай это, запустив $watcher.EnableRaisingEvents = $true, Думайте об этом флаге как о выключателе $watcher : Если переключатель выключен, ничего не произойдет, если будут внесены какие-либо изменения. Вы также можете указать, чтобы он смотрел на файлы и папки, вложенные в один набор в пути, изменив IncludeSubdirectories признак истины так же, как вы сделали EnableRaisingEvents флаг.

Определение действий для принятия

После того, как объект-наблюдатель настроен, вы должны дать ему действие, которое нужно выполнить после обнаружения этого изменения. Это может быть так же просто, как запись в системный журнал, или так же радикально, как инициирование замены экземпляра чистым исходным кодом. Для начала вам нужно определить блок действия в коде. Вот один из них, который просто пишет в консоль:

$action = {
    $path = $event.SourceEventArgs.FullPath
    $name = $event.SourceEventArgs.Name
    $changetype = $event.SourceEventArgs.ChangeType
    Write-Host "File $name at path $path was $changetype at $(get-date)"
}

Вы можете видеть, что этот код извлекает переменные из события, используя $event переменная, которая создается для вас, когда событие создается объектом-наблюдателем. Как только событие завершается, переменная также завершается, что означает, что у нее будут только данные, относящиеся к этому событию.

Использование Register-ObjectEvent

Итак, у вас есть настроенный FileSystemWatcher, и у вас есть действия, которые вы хотите выполнять всякий раз, когда что-то происходит. Прямо сейчас, эти двое являются отдельными и не знают друг о друге. Чтобы заставить их работать вместе, вы должны зарегистрировать действия с событием. PowerShell имеет целый командлет для этого — Регистр-ObjectEvent Командлет. Чтобы использовать Register-ObjectEvent, вы должны передать ему три вещи:

  • Объект FileSystemWatcher
  • Тип события для запуска действий на
  • Действия, которые вы определили ранее

Если вы настроили все так, как указано выше, это будет выглядеть примерно так: Register-ObjectEvent $watcher 'Event Action' -Action $action. «Действие события» может быть заменено любым событием из FileSystemWatcher, но это будет хорошей демонстрацией.

Тестирование

Теперь вы можете проверить все это. В этом разделе вы создадите новый файл в указанном каталоге, увидите действие события, затем отключите и отмените регистрацию события.

Чтобы создать новый файл и вызвать событие, запустите следующую строку в PowerShell. Это на Ubuntu Linux, но если вы следите за Windows, замените / Главная / убунту / с C: и / с ,

New-Item -Path "/home/ubuntu/WatchThisFolder/newFile" -ItemType File

Как только вы введете это, событие сработает и действие сработает.

File newFile at path /home/ubuntu/WatchThisFolder/newFile was Created at 09/26/2019 20:49:54

Он срабатывает каждый раз, когда вы создаете новый файл в этом каталоге или что-либо вложенное в него, если вы включили IncludeSubdirectories флаг. Теперь, когда вы знаете, что повышение события работает, выключите его, запустив $watcher.EnableRaisingEvents = $false, затем попробуйте создать новый файл. Файл должен быть создан, но событие не отображается. Это может быть очень полезно, если вы отлаживаете и не хотите ничего запускать во время работы в файловой системе.

Как только вы закончите, бегите Get-EventSubscriber | Unregister-Event отменить регистрацию события от действия. Теперь, даже если флаг EnableRaisingEvents имеет значение true и действие происходит, действие не будет запускаться.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован.