Cómo supervisar una carpeta en busca de cambios de forma sencilla

Monitorear una carpeta en busca de cambios puede ser muy útil. Puede configurarlo para que cuando se agregue o elimine algo en la carpeta, pueda ser notificado por correo electrónico o se pueda agregar una entrada en un archivo de registro para que pueda tener un historial de lo que sucedió. El problema es que Windows no tiene esta función de monitoreo disponible lista para usar. Entonces, ¿cómo podemos abordar esto de una manera fácil y sin comprar ningún software?

El marco de Windows .NET tiene una clase llamada FileSystemWatcher en System.IO NameSpace que ha existido durante años. Si eres un programador, probablemente puedas crear una pequeña aplicación usando esta clase con bastante facilidad. Pero si no, aquí hay una forma de PowerShell a la que también puede abordar.

El siguiente código, cuando se ejecuta, supervisa la carpeta H: Temp y escribe una entrada cuando se detecta algún tipo de cambio.

$log = "$homeDesktopLog.txt"
$pathtomonitor = "H:temp"
$timeout = 1000

$FileSystemWatcher = New-Object System.IO.FileSystemWatcher $pathtomonitor
$FileSystemWatcher.IncludeSubdirectories = $true

Write-Host "Monitoring content of $PathToMonitor"
while ($true) {
$change = $FileSystemWatcher.WaitForChanged('All', $timeout)
if ($change.TimedOut -eq $false)
{
# get information about the changes detected
Write-Host "Change detected:"
$change | Out-Default
(Get-Date), $change.ChangeType.ToString(), $change.Name | Out-File $log -Append
}
else
{
Write-Host "." -NoNewline
}
}

Obviamente, no es ideal y tiene algunos defectos. Por ejemplo, si elimino varios archivos a la vez, solo se detecta el primero. Eso es porque este código se ejecuta secuencialmente. cuando se detecta un cambio, inicia el procedimiento de procesamiento y omite el segundo cambio que se produce inmediatamente después.

Aquí hay un mejor ejemplo en Idera que toma la misma ruta pero utiliza un enfoque asincrónico que mantiene la supervisión y el procesamiento funcionando al mismo tiempo, de modo que cuando ocurre un cambio no detiene la supervisión. Utiliza una cola internamente, por lo que cuando hay muchos cambios en un período de tiempo muy corto, todos se alinearán en la cola y se procesarán una vez que PowerShell ya no esté ocupado.

/ Actualización el 4 de febrero de 2019 /

José F. Roniello ha creado un módulo de PowerShell llamado pswatch para simplificar todo el proceso. El módulo está disponible en la Galería de PowerShell, por lo que no puede usar Import-Module directamente. Pero así es como puede importar, gracias a 4Sysops.

iex ((new-object net.webclient).DownloadString("http://bit.ly/Install-PsWatch")) 
Import-Module pswatch
image 5 600x222 - Cómo monitorear una carpeta para cambios de la manera fácil

Deja un comentario