Agence web » Actualités du digital » Comment surveiller un dossier Windows pour de nouveaux fichiers et prendre des mesures

Comment surveiller un dossier Windows pour de nouveaux fichiers et prendre des mesures

Les fichiers sont dans un état constant de flux sur n'importe quel système d'exploitation. Parfois, ils sont créés, parfois ils sont supprimés, parfois ils sont modifiés, et ce sont des choses normales pour un système d'exploitation. Parfois, lorsqu'un fichier est modifié, il peut provoquer une instabilité dans une autre application qui en dépend, comme la modification d'un numéro de port dans un fichier de propriétés, un paramètre dans un manifeste de déploiement ou même la correction de code en production sans passer par le contrôle de code source.

Dans le cadre de la gestion de ces systèmes d'exploitation, les ingénieurs ont besoin d'un moyen de surveiller ce qui arrive à ces fichiers critiques et de prendre des mesures lorsque quelque chose se produit. Entrez la classe .NET FileSystemWatcher et PowerShell.

Dans .NET et .NET Core, FileSystemWatcher est une classe qui vit dans le System.IO espace de noms et surveille les fichiers. Dans PowerShell, cela peut être très utile, surtout lorsqu'il est combiné avec d'autres fonctions PowerShell.

Instanciation de FileSystemWatcher

Instanciez cette classe dans PowerShell en exécutant $watcher = New-Object System.IO.FileSystemWatcher. Une fois que vous avez terminé, vous devez lui indiquer le dossier à regarder. Pour ce faire, définissez le Chemin sur l'objet FileSystemWatcher vers le chemin du dossier que vous souhaitez qu'il regarde. Si vous avez un dossier sous Windows appelé WatchThisFolder en dessous de C: , vous définiriez le FileSystemWatcher à cela en exécutant $watcher.Path = 'C:WatchThisFolder'.

Étant donné que cette classe est également dans .NET Core, vous pouvez faire tout cela sur un système Linux ou Mac OS de la même manière que vous le feriez sur un système Windows. Par exemple, si vous aviez un dossier sur Ubuntu Linux appelé WatchThisFolder sous votre répertoire utilisateur actuel, vous exécuteriez $watcher.Path = '/home/ubuntu/WatchThisFolder'.

Le reste des exemples de code de cet article fonctionnent sur l'une ou l'autre plate-forme sans aucune modification.

Déclenchement d'événements à partir de FileSystemWatcher

Maintenant que vous avez un nouvel objet FileSystemWatcher, vous pouvez jeter un œil sous le capot et essayer de le comprendre. Pour voir les types spécifiques d'événements du système de fichiers que FileSystemWatcher recherche, entrez $watcher | Get-Member -MemberType Event. Get-Member montre tout ce que l'objet passé en lui contient, et en ajoutant le filtre MemberType, vous pouvez voir une certaine catégorie, dans ce cas, les événements.

Ces événements sont:

  • Modifié
  • Créé
  • Effacé
  • Jeté
  • Erreur
  • Renommé

Lorsqu'un ou plusieurs de ces événements FileSystemWatcher sont détectés sur le chemin que l'objet est défini pour surveiller, l'objet observateur déclenche un événement externe, pour lequel vous pouvez définir des actions.

Maintenant que l'objet observateur sait quoi surveiller et que vous savez quels événements il surveille, vous devez le configurer pour déclencher un événement lorsqu'une action est détectée. Pour ce faire, exécutez $watcher.EnableRaisingEvents = $true. Considérez ce drapeau comme un interrupteur marche / arrêt pour $watcher : Si l'interrupteur est désactivé, rien ne se passera si des modifications sont apportées. Vous pouvez également lui demander d'examiner les fichiers et les dossiers imbriqués sous celui défini dans le chemin d'accès en modifiant Inclure les sous-répertoires drapeau à vrai de la même manière que vous avez fait le EnableRaisingEvents drapeau.

Définition des actions à entreprendre

Une fois que l'objet observateur est configuré, vous devez lui donner une action à effectuer une fois ce changement détecté. Cela peut être aussi simple que d'écrire dans un journal système, ou aussi radical que de déclencher un remplacement de l'instance par une extraction nette du code source. Pour commencer, vous devez définir un bloc d'action dans le code. En voici un qui écrit sur la console:

$action = {
    $path = $event.SourceEventArgs.FullPath
    $name = $event.SourceEventArgs.Name
    $changetype = $event.SourceEventArgs.ChangeType
    Write-Host "File $name at path $path was $changetype at $(get-date)"
}

Vous pouvez voir que ce code extrait des variables de l'événement à l'aide de la commande $event variable, qui est créée pour vous lorsque l'événement est créé par l'objet observateur. Dès que l'événement se termine, la variable se termine également, ce qui signifie qu'elle ne contiendra que des données pertinentes pour cet événement.

Utilisation de Register-ObjectEvent

Donc, vous avez configuré FileSystemWatcher et vous avez des actions que vous souhaitez entreprendre chaque fois que quelque chose se produit. Pour l'instant, ces deux-là sont séparés et ne se connaissent pas. Pour les faire travailler ensemble, vous devez enregistrer les actions avec l'événement. PowerShell a une applet de commande complète pour cela: l'applet de commande Register-ObjectEvent. Pour utiliser Register-ObjectEvent, vous devez lui passer trois choses:

  • L'objet FileSystemWatcher
  • Le type d'événement sur lequel déclencher les actions
  • Les actions que vous avez définies précédemment

Si vous avez tout configuré de la même manière que ci-dessus, cela ressemblera à ceci: Register-ObjectEvent $watcher 'Event Action' -Action $action. ‘Event Action’ peut être remplacé par n’importe quel événement du FileSystemWatcher, mais cela fera une belle démonstration.

Le tester

Vous pouvez maintenant tout tester. Dans cette section, vous allez créer un nouveau fichier dans le répertoire spécifié, voir l'action d'événement, puis désactiver et désenregistrer l'événement.

Pour créer un nouveau fichier et déclencher l'événement, exécutez la ligne ci-dessous dans PowerShell. C'est sur Ubuntu Linux, mais si vous suivez sur Windows, remplacez / accueil / ubuntu / avec C: et / avec .

New-Item -Path "/home/ubuntu/WatchThisFolder/newFile" -ItemType File

Dès que vous entrez cela, l'événement se déclenche et l'action se déclenche.

File newFile at path /home/ubuntu/WatchThisFolder/newFile was Created at 09/26/2019 20:49:54

Il se déclenche chaque fois que vous créez un nouveau fichier dans ce répertoire ou quelque chose imbriqué sous celui-ci, si vous avez activé Inclure les sous-répertoires drapeau. Maintenant que vous savez que déclencher l'événement fonctionne, désactivez-le en exécutant $watcher.EnableRaisingEvents = $false, puis essayez de créer un nouveau fichier. Le fichier doit être créé, mais aucun événement ne s'affiche. Cela peut être très utile si vous déboguez et que vous ne voulez rien déclencher pendant que vous travaillez dans le système de fichiers.

Une fois que vous avez terminé, exécutez Get-EventSubscriber | Unregister-Event pour désinscrire l'événement de l'action. Maintenant, même si le drapeau EnableRaisingEvents est vrai et que l'action se produit, l'action ne se déclenchera pas.

★★★★★