Главная > Powershell > Подписка на события ОС в Powershell

Подписка на события ОС в Powershell

Powershell умеет подписываться на события, происходящие в операционной системе и реагировать на них выполнением определённого кода. Что позволяет запускать скрипты не только вручную, или по расписанию, но и по факту возникновения какого-либо события. Событием может быть, например, возникновение процесса, изменение/удаление файла и т. д. За каждую область событий отвечает свой провайдер. Так, за появлением процессов следит ManagementEventWatcher, а файловую систему мониторит FileSystemWatcher.

Ниже пойдёт речь о мониторинге каталога на предмет создания в нём файлов определённого типа.

Это лишь один из способов следить за файловой системой, который я увидел на одном забугорном сайте, и решил им поделиться.

Для начала определим каталог, за которым будем следить, и таймаут ожидания события:

# Каталог, в котором будем следить за файлами
$Path = "D:\Doc"

# Таймаут (в мс.)
$Timeout = 1000

 Далее создаём объект и задаём нужные нам свойства: 

# Создаём объект, который будет следить за возникновением события
$Watcher = New-Object System.IO.FileSystemWatcher

# Задаём путь к каталогу, за которым нужно следить
$Watcher.Path = $Path

# При необходимости задаём фильтр
$Watcher.Filter = "*.mp3"

Вызываем метод WaitForChanged, в котором указываем событие, которое мы ждём, и таймаут до завершения ожидания:

$Result = $Watcher.WaitForChanged("created", $Timeout)

Этот метод ожидает до тех пор, пока не произойдёт событие, или же не истечёт время ожидания (если задать $Timeout = –1, то ожидание будет длиться бесконечно).

Наиболее распространённые события:

  • Changed — Изменение файла или каталога.
  • Открытое событиеCreated — Создание файла или каталога.
  • Открытое событиеDeleted — Удаление файла или каталога.
  • Renamed — Переименование файла или каталога.

В нашём случае метод будет ждать либо появления в указанной папке .mp3 файла, либо истечение таймаута в 1 сек.

Можно, конечно, задать таймаут побольше, но лучше зациклить, например, до нажатия любой клавиши. При возникновении события для примера выведем сообщение с именем нового файла:

do
{
    $Result = $Watcher.WaitForChanged("created", $Timeout)

    # Значение true, если время ожидания метода WaitForChanged истекло;
    # в противном случае — значение false.
    if ($Result.TimedOut -eq $false)
    {
        [System.Windows.Forms.MessageBox]::Show($Result.Name,
        "Появился новый файл", [System.Windows.Forms.MessageBoxButtons]::OK)
    }
}
until ([System.Console]::KeyAvailable)

В результате работы скрипта при появлении файлов mp3 в каталоге D:\Doc на экране будет появляться сообщение, информирующее о появлении нового файла:

test.mp3

Реклама
Рубрики:Powershell Метки: ,
  1. Комментариев нет.
  1. No trackbacks yet.

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: