Como monitorar uma pasta do Windows para novos arquivos e executar uma ação
Os arquivos estão em constante estado de fluxo em qualquer sistema operacional. Às vezes, eles são criados, às vezes são excluídos, às vezes são alterados e essas são coisas normais para um sistema operacional. Às vezes, quando um arquivo é alterado, pode causar instabilidade em outro aplicativo que depende 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 fixar código na produção sem passar pelo controle de origem. / p>
Como parte do gerenciamento desses sistemas operacionais, os engenheiros precisam de uma maneira de observar o que acontece com esses arquivos críticos e agir quando algo acontece. Digite a classe . NET FileSystemWatcher e o PowerShell.
No . NET e . NET Core, o FileSystemWatcher é uma classe que reside no espaço para nome System. IO e monitora os arquivos. No PowerShell, isso pode ser muito útil, especialmente quando combinado com outras funções do PowerShell.
Instanciando o FileSystemWatcher
Instancie essa classe no PowerShell executando $ watcher = New-Object System. IO. FileSystemWatcher. Depois de fazer isso, você precisará dizer a qual pasta assistir. Você faz isso definindo o parâmetro Path no objeto FileSystemWatcher como o caminho da pasta que deseja assistir. Se você tiver uma pasta no Windows chamada WatchThisFolder em C: \, defina o FileSystemWatcher para isso executando $ watcher. Path = 'C: \ WatchThisFolder'.
Como essa classe também está no . NET Core, você pode fazer tudo isso em um sistema Linux ou Mac OS da mesma maneira que faria em um sistema Windows. Por exemplo, se você tivesse uma pasta no Ubuntu Linux chamada WatchThisFolder no diretório de usuário atual, você executaria $ watcher. Path = '/ home / ubuntu / WatchThisFolder'.
O restante dos exemplos de código deste artigo funciona em qualquer plataforma sem nenhuma alteração.
Acionando eventos do FileSystemWatcher
Agora que você tem um novo objeto FileSystemWatcher, pode dar uma olhada por baixo do capô e tentar descobrir. Para ver os tipos específicos de eventos do sistema de arquivos que o FileSystemWatcher está assistindo, digite $ watcher | Evento Get-Member -MemberType. Get-Member mostra tudo o que o objeto passou para ele e, adicionando o filtro MemberType, você pode ver uma determinada categoria, nesse caso, eventos.
Esses eventos são:
- Alterado
- Criado
- Excluído
- Disposto
- Erro
- Renomeado
Quando um ou mais desses eventos FileSystemWatcher são detectados no caminho que o objeto está configurado para assistir, o objeto watcher gera um evento externo, para o qual você pode definir ações.
Agora que o objeto observador sabe o que assistir e você sabe quais eventos ele está assistindo, você deve configurá-lo para gerar um evento quando uma ação for detectada. Faça isso executando $ watcher. EnableRaisingEvents = $ true. Pense neste sinalizador como um botão liga / desliga para $ watcher: Se o botão estiver desligado, nada acontecerá se forem feitas alterações. Você também pode pedir para ele procurar arquivos e pastas aninhados sob o conjunto no caminho, alterando o sinalizador IncludeSubdirectories para true da mesma maneira que o sinalizador EnableRaisingEvents.
Definindo ações a serem executadas
Depois que o objeto do inspetor estiver configurado, você deverá executar uma ação para executar assim que a alteração for detectada. Isso pode ser tão simples quanto gravar em um log do sistema ou tão drástico quanto desencadear uma substituição da instância por um puxão limpo do código-fonte. Para começar, você precisa definir um bloco de ação no código. Aqui, basta escrever no console:
$ action = {$ path = $ event. SourceEventArgs. FullPath $ name = $ event. SourceEventArgs. Name $ changetype = $ event. SourceEventArgs. ChangeType Host de gravação "O arquivo $ name no caminho $ path era $ tipo de alteração em $ (data de chegada) "}
Você pode ver que esse código está obtendo variáveis do evento usando a variável $ event, que é criada para você quando o evento é criado pelo objeto watcher. Assim que o evento termina, a variável também termina, o que significa que ela só terá dados relevantes para esse evento.
Usando o Register-ObjectEvent
Então, você configurou o FileSystemWatcher e ações que deseja executar sempre que algo acontecer. No momento, esses dois estão separados e não se conhecem. Para que eles funcionem juntos, você deve registrar as ações no evento. O PowerShell tem um cmdlet inteiro para esse cmdlet Register-ObjectEvent. Para usar o Register-ObjectEvent, você deve passar três coisas:
- O objeto FileSystemWatcher
- O tipo de evento para acionar as ações
- As ações que você definiu anteriormente
Se você configurou tudo da mesma maneira que está listado acima, será algo como isto: Register-ObjectEvent $ watcher 'Ação do evento' - Ação $ ação. A "Ação do evento" pode ser substituída por qualquer evento do FileSystemWatcher, mas isso resultará em uma boa demonstração.
testando
Agora você pode testar tudo. Nesta seção, você criará um novo arquivo no diretório especificado, consulte a ação do evento, desative e cancele o registro do evento.Para criar um novo arquivo e acionar o evento, execute a linha abaixo no PowerShell. Isso está no Ubuntu Linux, mas se você estiver seguindo o Windows, substitua / home / ubuntu / por C: \ e / por \.
New-Item -Path "/ home / ubuntu / WatchThisFolder / newFile" -ItemType Arquivo
Assim que você entra, o evento é acionado e a ação é acionada.
O arquivo newFile no caminho / home / ubuntu / WatchThisFolder / newFile foi criado em 26/09/2019 20:49:54
É acionado toda vez que você cria um novo arquivo nesse diretório ou qualquer coisa aninhada sob ele, se você ativou o sinalizador IncludeSubdirectories. Agora que você sabe que o aumento do evento funciona, desative-o executando $ watcher. EnableRaisingEvents = $ false e 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 desejar acionar nada enquanto estiver trabalhando no sistema de arquivos.
Quando terminar, execute Get-EventSubscriber | Cancelar registro de evento para cancelar o registro do evento da ação. Agora, mesmo que o sinalizador EnableRaisingEvents seja verdadeiro e a ação aconteça, a ação não será acionada.
Via: How to Geek
Nenhum comentário