Como monitorar uma pasta do Windows em busca de novos arquivos e agir

Conteúdo

Os arquivos estão em um estado de constante mudança em qualquer sistema operacional. Às vezes eles são criados, às vezes eles são removidos, às vezes eles mudam, e todas essas são coisas normais que um sistema operacional deve fazer. As vezes, quando um arquivo é alterado, pode causar instabilidade em outro aplicativo que dependa dele, como alterar um número de porta em um arquivo de propriedades, um parâmetro em um manifesto de implantação ou até mesmo corrigir o código em produção sem passar pelo controle de origem.

Como parte da administração desses sistemas operacionais, os engenheiros precisam de uma maneira de observar o que acontece com esses arquivos críticos e agir quando algo acontecer. Entre no .NET Clase FileSystemWatcher y PowerShell.

Em .NET e .NET Core, FileSystemWatcher é uma classe que vive no System.IO namespace e arquivos de monitor. Um PowerShell, Isso pode ser muito útil, especialmente quando combinado com outras funções do PowerShell.

Instanciação de FileSystemWatcher

Crie uma instância desta classe no PowerShell executando $watcher = New-Object System.IO.FileSystemWatcher. Uma vez que eu faço, você deve dizer a ele em qual pasta olhar. Você pode fazer isso definindo o Caminho no objeto FileSystemWatcher para o caminho da pasta que você deseja ver. Se você tiver uma pasta no Windows chamada WatchThisFolder abaixo C:, você deve definir FileSystemWatcher nele executando $watcher.Path="C:WatchThisFolder".

Porque esta classe também está no .NET Core, você pode fazer tudo isso em um sistema Linux ou Mac OS da mesma forma que faria em um sistema Windows. Como um exemplo, se eu tivesse uma pasta no Ubuntu Linux chamada WatchThisFolder sob seu diretório de usuário atual, deve correr $watcher.Path="/home/ubuntu/WatchThisFolder".

O restante dos exemplos de código nesta postagem funcionam em qualquer uma das plataformas sem nenhuma alteração..

Ativação de evento de FileSystemWatcher

Agora que você tem um novo objeto FileSystemWatcher, você pode dar uma olhada sob o capô e tentar descobrir. Para visualizar os tipos específicos de eventos do sistema de arquivos que FileSystemWatcher está observando, digitar $watcher | Get-Member -MemberType Event. Obter membro mostra tudo o que está contido no objeto que aconteceu com ele e, ao adicionar o filtro MemberType, pode ver uma certa categoria, nesta circunstância, eventos.

Esses eventos são:

  • Mudar
  • Criada
  • Removido
  • Disposto
  • Erro
  • Renomado

Quando um ou mais desses eventos FileSystemWatcher são detectados no caminho que o objeto está configurado para observar, o objeto de observação gera um evento externo, para o qual você pode definir ações.

Agora que o objeto observador sabe o que olhar e você sabe quais eventos ele está observando, você precisa configurá-lo para disparar um evento quando uma ação for detectada. Faça isso correndo $watcher.EnableRaisingEvents = $true. Pense neste sinalizador como um botão liga / desliga / fora para $watcher : Se o interruptor estiver desligado, nada vai acontecer se mudanças forem feitas. Além disso, você pode dizer a ele para olhar os arquivos e pastas aninhados abaixo do conjunto no caminho, alterando o Incluir subdiretórios a bandeira para verdadeiro da mesma maneira que você fez EnableRaisingEvents bandeira.

Definição de ações a serem tomadas

Uma vez que o objeto observador é configurado, você precisa dar a ele uma ação a ser executada assim que a mudança for detectada. Isso pode ser tão simples quanto escrever em um log do sistema, ou tão drástico quanto desencadear uma substituição de instância com uma extração limpa do código fonte. Para iniciar, você deve definir um bloco de ação em seu código. Aqui está um que você só digita no console:

$ação = {
    $path = $event.SourceEventArgs.FullPath
    $name = $event.SourceEventArgs.Name
    $changetype = $event.SourceEventArgs.ChangeType
    Write-Host "$name de arquivos no caminho $path foi $changetype em $(get-date)"
}

Você pode ver que este código está extraindo variáveis do evento usando o $event variável, que é criado automaticamente quando o objeto observador cria o evento. Assim que o evento terminar, a variável também termina, o que significa que você só terá dados relevantes para aquele evento.

Usando o Register-ObjectEvent

Então, você tem o FileSystemWatcher configurado e tem ações que deseja realizar sempre que algo acontecer. Neste momento, estes dois estão separados e não se conhecem. Para que trabalhem juntos, deve registrar as ações com o evento. PowerShell tem um cmdlet completo para isso: a Register-ObjectEvent cmdlet. Para utilizar Register-ObjectEvent, três coisas devem acontecer com ele:

  • O objeto FileSystemWatcher
  • O tipo de evento para disparar as ações em
  • As ações que você definiu anteriormente

Se você configurou tudo da mesma forma listada anteriormente, Isso parecerá assim: Register-ObjectEvent $watcher 'Event Action' -Action $action. ‘Ação do Evento’ pode ser substituído por qualquer evento do FileSystemWatcher, mas esta será uma boa demonstração.

Testando

Agora você pode tentar de tudo. Nesta secção, irá criar um novo arquivo no diretório especificado, você verá a ação do evento, mais tarde desabilite e cancele o registro do evento.

Para criar um novo arquivo e disparar o evento, execute a próxima linha no PowerShell. Isso está no Ubuntu Linux, mas se você estiver seguindo no windows, substituir / começo / ubuntu / com C: e / com .

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

Assim que eu entrar, o evento dispara e a ação dispara.

O arquivo newFile no caminho / home / ubuntu / WatchThisFolder / newFile foi criado em 09/26/2019 20:49:54

Ele dispara toda vez que você cria um novo arquivo nesse diretório ou qualquer coisa aninhada abaixo dele, se você habilitou o Incluir subdiretórios bandeira. Agora que você sabe que incrementar o evento funciona, desligue-o correndo $watcher.EnableRaisingEvents = $false, mais tarde, tente criar um novo arquivo. O arquivo deve ser criado, mas nenhum evento é exibido. Isso pode ser muito útil se você estiver depurando e não quiser ativar nada enquanto trabalha no sistema de arquivos.

Quando eu terminar, corre Get-EventSubscriber | Unregister-Event para cancelar o registro do evento da ação. Agora, mesmo se o sinalizador EnableRaisingEvents for verdadeiro e a ação ocorrer, a ação não vai disparar.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.