Sunday, April 28, 2024
HomePowershellComo monitorar uma pasta usando Powershell

Como monitorar uma pasta usando Powershell


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:Take a look at 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  = $Occasion.EventIdentifier
    SourceIdentifier = $Occasion.SourceIdentifier
    TimeStamp        = $Occasion.TimeGenerated
    FullPath         = $Occasion.SourceEventArgs.FullPath
    ChangeType       = $Occasion.SourceEventArgs.ChangeType
}

Dentro de Motion, todos os parâmetros do evento podem ser encontrados dentro da variavel $Occasion

Ao closing o log irá ser criado e atualizado e ficará desta maneira:

Como monitorar uma pasta usando Powershell
D:Testlog.csv

Script Completo:

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "D:Take a look at"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true  


$ObjectEvent = @{
    InputObject = $watcher 
    EventName = 'Created'
    Motion = { 
        $logEntry = [pscustomobject]@{
            EventIdentifier  = $Occasion.EventIdentifier
            SourceIdentifier = $Occasion.SourceIdentifier
            TimeStamp        = $Occasion.TimeGenerated
            FullPath         = $Occasion.SourceEventArgs.FullPath
            ChangeType       = $Occasion.SourceEventArgs.ChangeType
        } 
        $logEntry | Export-Csv -Path "D:Testlog.csv" -Append -NoTypeInformation
    }
}
Register-ObjectEvent @ObjectEvent

Lembrando apenas que esse evento não é permanente, você deverá manter a console aberta para que ele proceed 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!

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments