Buscar

PowerShell: Monitorear carpeta archivos nuevos

En este artículo veremos cómo monitorear una carpeta en busca de archivos nuevos utilizando PowerShell.

Uno de los quebraderos de cabeza más grandes que tenemos los syadmins es cuando tenemos que detectar si se ha dado una situación o evento.
 
Escenarios de ejemplo:

Todos los días el ERP exporta un informe en una carpeta que es usado por un script de PowerShell.

Solución típica: Múltiples tareas (o cron):

Normalmente se programan dos tareas programadas (o cron):

Tarea 1: "22:30 Exportación base de datos a .csv para informes nocturnos."
Tarea 2: "23:30 Generación diaria de informes nocturnos."

A veces la Tarea 1 está programada en un equipo y la Tarea 2 en otro equipo, de tal forma que para que funcione debemos cruzar los dedos y esperar que nada falle.

Una tarea programada que se ejecuta para comprobar si hay novedades:

Otro caso muy típico es una tarea programada que se ejecuta varias veces al día para comprobar si hay que sincronizar datos de una base de datos a otra: Por ejemplo un .csv con datos que añadir a Directorio Activo.

Un script que lanza una consulta recurrente al visor de eventos para ver si se ha conectado algún dispositivo o ha ocurrido algún evento concreto.

A veces también se dan situaciones en que algún script tiene que ir consultando mediante CIM, WMI, visor de eventos o registro de Windows para ver si ha ocurrido cierto evento.

Todos estos métodos aún que suelen funcionar tienen ciertas desventajas:

- Comprobar si ha sucedido o no el evento suele consumir muchos recursos ya que van lanzando consultas continuas para verificar si ha cambiado o no un estado o si ha ocurrido un evento.

- La detección del evento, contexto o situación no es inmediata ya que sólo se comprueba cada cierto tiempo.

- A más tiempo entre comprobaciones mejor rendimiento pero más se tarda en actuar.

- A menos tiempo entre comprobaciones menor rendimiento pero menos se tarda en actuar.

- Es complejo ajustar el tiempo idóneo entre comprobación y comprobación.

- Si la tarea anterior falla la siguiente intenta ejecutarse sin ningún tipo de control de fallos.

PowerShell: FileSystemWatcher

Con el método que presentaremos a continuación seremos capaces de detectar si se ha creado un fichero nuevo en una carpeta e inmediatamente a la detección de un fichero nuevo ejecutar un script.

No será necesaria ninguna tarea programada recurrente y tendremos la ventaja de que se ejecuta sólo si hay un fichero nuevo e inmediatamente después de que se genere el fichero además el uso de recursos es muy bajo.

Ejemplo de código:

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = 'C:\1\'
$watcher.EnableRaisingEvents = $true

$action =
{
    $FullPath = $event.SourceEventArgs.FullPath
    $ChangeType = $event.SourceEventArgs.ChangeType
    Write-Host "$(Get-Date)Nuevo $FullPath detectado $ChangeType"

    #Emitimos pitido    
    [console]::Beep()
    
    #Abrimos calculadora
    calc

}


Register-ObjectEvent $watcher 'Created' -Action $action

Resultado:
 
PowerShell: Monitorear carpeta en busca de archivos nuevos

Explicación:

Usamos el cmdlet Register-ObjectEvent que realiza la suscripción a los eventos generados por los objetos de .NET Framework en el equipo local o en un equipo remoto.

Es decir avisamos a Windows que si se da cierto evento (creación de un fichero) queremos ejecutar un código ($accion), de esta forma si Windows detecta un nuevo fichero lanzará el código que haya en $accion.

El código de $accion solo será ejecutado sólo si Windows detecta este evento.

En el apartado $action = {} podemos añadir cualquier código de PowerShell, en nuestro caso nos hemos limitado a mostrar un mensaje, emitir un pitido y abrir la calculadora pero podríamos hacer cualquier cosa.

Una vez terminado, si lo deseamos, podemos desregistar el “vigilador” ejecutando:

Get-EventSubscriber | Unregister-Event

Notas finales:

En este caso hemos usado el cmdlet Register-ObjectEvent para detectar creación de ficheros pero se puede utilizar en infinidad de situaciones como por ejemplo:

- Detectar si se ha enchufado un pen usb.

- Detectar si se ha modificado la configuración de pantalla (incluso conectado un hdmi, usb-c o dockstation…)

- Detectar que se han conectado los auriculares.

- Detectar que se ha hecho un cambio de usuario.

- Detectar que se ha descargado o subido un fichero.

- Detectar que se han modificado las fuentes del sistema.

- Detectar que se ha cambiado la hora del sistema.

- Detectar que se ha enchufado el cargador de batería.
 
Video

A continuación, disponemos del siguiente vídeo, donde podemos ver el detalle de funcionamiento de forma visual:


Podéis examinar y suscribiros al canal de Youtube de SYSADMIT en el siguiente enlace:

https://www.youtube.com/c/SYSADMIT
 

No hay comentarios:

Publicar un comentario