Olá Pessoal,
Ocasionalmente recebo no chat ou por algum contato de mídia social a seguinte pergunta: “Como monitorar uma pasta usando Powershell?” A resposta não é nada difícil, apenas não é intuitiva, usando o FileSystemWatcher. Essa classe permite dispara eventos específicos quando a condição é atingida e a partir desses eventos podemos executar ações específicas.
Neste exemplo iremos monitorar a pasta D:\Test por qualquer tipo de arquivo(é possível criar filtros por extensão), e podemos incluir subdiretórios. Uma coisa importante é definir a propriedade EnableRaisingEvents
como $true
. Feito isso o watcher já estará observando mudanças no diretório especificado.
Agora podemos utilizar o comando Register-ObjectEvent
para criar ações específicas por tipo de evento, neste exemplo irei monitorar o evento Created
, que é disparado toda vez que um arquivo é criado no diretório monitorado.
Neste exemplo vou criar um arquivo de log em formato CSV no mesmo diretório e adicionar uma entrada para cada arquivo que foi criado, há outros tipos de evento para monitorar deleção ou modificação de arquivo, esses eventos podem ser encontrados na documentação da classe, bastará então mudar o EventName para o desejado e alterar a ação dentro do scriptblock.
O Log terá o seguinte formato:
[pscustomobject]@{
EventIdentifier = $Event.EventIdentifier
SourceIdentifier = $Event.SourceIdentifier
TimeStamp = $Event.TimeGenerated
FullPath = $Event.SourceEventArgs.FullPath
ChangeType = $Event.SourceEventArgs.ChangeType
}
Dentro de Action, todos os parâmetros do evento podem ser encontrados dentro da variavel $Event
Ao final o log irá ser criado e atualizado e ficará desta maneira:
Script Completo:
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "D:\Test"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
$ObjectEvent = @{
InputObject = $watcher
EventName = 'Created'
Action = {
$logEntry = [pscustomobject]@{
EventIdentifier = $Event.EventIdentifier
SourceIdentifier = $Event.SourceIdentifier
TimeStamp = $Event.TimeGenerated
FullPath = $Event.SourceEventArgs.FullPath
ChangeType = $Event.SourceEventArgs.ChangeType
}
$logEntry | Export-Csv -Path "D:\Test\log.csv" -Append -NoTypeInformation
}
}
Register-ObjectEvent @ObjectEvent
Lembrando apenas que esse evento não é permanente, você deverá manter a console aberta para que ele continue registrando os eventos, é possível criar subscrições de evento permanentes, porém utilizando eventos WMI.
Dessa forma, foi possível aprender como monitorar uma pasta usando Powershell.
Dúvidas? Sugestões? Comente!
Até a próxima!