Les fichiers sont en constante évolution sur n'importe quel système d'exploitation. Parfois, ils sont créés, parfois ils sont supprimés, parfois ils changent, et toutes ces choses sont normales qu'un système d'exploitation devrait faire. Parfois, quand un fichier est modifié, cela peut provoquer une instabilité dans une autre application qui en dépend, comment changer un numéro de port dans un fichier de propriétés, un paramètre dans un manifeste de déploiement ou même corriger le code en production sans passer par le contrôle de source.
Dans le cadre de l'administration de ces systèmes d'exploitation, les ingénieurs ont besoin d'un moyen d'observer ce qui arrive à ces fichiers critiques et de prendre des mesures lorsque quelque chose se produit. Entrez le .NET Classe FileSystemWatcher et PowerShell.
En .NET y .NET Core, FileSystemWatcher est une classe qui vit dans le System.IO espace de noms et fichiers de contrôle. Un PowerShell, Cela peut être très utile, surtout lorsqu'il est combiné avec d'autres fonctions PowerShell.
Instanciation de FileSystemWatcher
Créez une instance de cette classe dans PowerShell en exécutant $watcher = New-Object System.IO.FileSystemWatcher
. Une fois que je fais, tu devrais lui dire quel dossier regarder. Vous pouvez le faire en définissant le Chemin dans l'objet FileSystemWatcher au chemin du dossier que vous souhaitez afficher. Si vous avez un dossier dans Windows appelé Regarder ce dossier au dessous de C:, vous devez définir FileSystemWatcher sur cela en exécutant $watcher.Path="C:WatchThisFolder"
.
Parce 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 j'avais un dossier sur Ubuntu Linux appelé Regarder ce dossier sous votre répertoire utilisateur actuel, devrait courir $watcher.Path="/home/ubuntu/WatchThisFolder"
.
Le reste des exemples de code de cet article fonctionne sur n'importe quelle plate-forme sans aucun changement..
Activation d'événement à partir de FileSystemWatcher
Maintenant que vous avez un nouvel objet FileSystemWatcher, tu peux jeter un oeil sous le capot et essayer de savoir. Pour afficher les types spécifiques d'événements de système de fichiers observés par FileSystemWatcher, Entrer $watcher | Get-Member -MemberType Event
. Obtenir un membre montre tout ce qui est contenu dans l'objet qui lui est arrivé et, lors de l'ajout du filtre MemberType, peut voir une certaine catégorie, dans cette circonstance, événements.
Ces événements sont:
- Changement
- Créé
- Supprimé
- Disposé
- Erreur
- Renommé
Lorsqu'un ou plusieurs de ces événements FileSystemWatcher sont détectés dans le chemin que l'objet est configuré pour surveiller, l'objet d'observation génère un événement externe, pour lequel vous pouvez définir des actions.
Maintenant que l'objet observateur sait quoi regarder et que vous savez quels événements il observe, vous devez le configurer pour déclencher un événement lorsqu'une action est détectée. Fais ça en courant $watcher.EnableRaisingEvents = $true
. Considérez ce drapeau comme un interrupteur d'alimentation / éteint pour $watcher
: Si l'interrupteur est éteint, rien ne se passera si des modifications sont apportées. De plus, vous pouvez lui dire de regarder les fichiers et dossiers imbriqués sous l'ensemble dans le chemin en modifiant le Inclure les sous-répertoires le drapeau à vrai de la même manière que vous avez fait le ActiverRaisingEvents drapeau.
Définition des actions à mener
Une fois l'objet observateur configuré, vous devez lui donner une action à entreprendre une fois que ce changement est détecté. Cela peut être aussi simple que d'écrire dans un journal système, ou aussi drastique que de déclencher un remplacement d'instance avec une extraction de code source propre. Pour commencer, vous devez définir un bloc d'action dans le code. En voici un qui n'écrit que sur la console:
$action = {
$path = $event.SourceEventArgs.FullPath
$name = $event.SourceEventArgs.Name
$changetype = $event.SourceEventArgs.ChangeType
Write-Host "Le $name de fichier au chemin d'$path a été $changetype à $(get-date)"
}
Vous pouvez voir que ce code extrait des variables de l’événement à l’aide de l’icône $event
variable, qui est créé automatiquement lorsque l’objet observateur crée l’événement. Dès la fin de l’événement, la variable se termine également, ce qui signifie que vous n’aurez que des données pertinentes pour cet événement.
Utilisation de Register-ObjectEvent
Ensuite, vous avez configuré FileSystemWatcher et vous avez des actions que vous souhaitez entreprendre chaque fois que quelque chose se produit. En ce moment, ces deux sont séparés et ne se connaissent pas. Pour qu'ils travaillent ensemble, doit enregistrer les actions avec l'événement. PowerShell a une applet de commande complète pour cela: les Register-ObjectEvent applet de commande. Pour utiliser Register-ObjectEvent, trois choses doivent lui arriver:
- 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 précédemment répertorié, Il ressemblera à ceci: Register-ObjectEvent $watcher 'Event Action' -Action $action.
« Action d'événement’ peut être remplacé par n'importe quel événement de FileSystemWatcher, mais ce sera une bonne démonstration.
Le tester
Maintenant, vous pouvez tout essayer. Dans cette section, va créer un nouveau fichier dans le répertoire spécifié, vous verrez l'action de l'événement, plus tard désactiver et désinscrire l'événement.
Pour créer un nouveau fichier et déclencher l'événement, exécuter la ligne suivante dans PowerShell. C'est sur Ubuntu Linux, mais si vous le suivez sur windows, remplacer / début / Ubuntu / avec C: Oui / avec .
Nouvel élément -Chemin "/home/ubuntu/WatchThisFolder/newFile" -Fichier de type d'élément
Dès que j'entre dans ça, l'événement se déclenche et l'action se déclenche.
Le fichier newFile at path /home/ubuntu/WatchThisFolder/newFile a été créé à 09/26/2019 20:49:54
Il se déclenche chaque fois que vous créez un nouveau fichier dans ce répertoire ou tout ce qui est imbriqué en dessous, si vous avez activé le Inclure les sous-répertoires drapeau. Maintenant que vous savez que l'incrémentation de l'événement fonctionne, éteignez-le en exécutant $watcher.EnableRaisingEvents = $false
, plus tard essayer de créer un nouveau fichier. Le fichier doit être créé, mais aucun événement n'est affiché. Cela peut être très utile si vous déboguez et que vous ne voulez rien activer pendant que vous travaillez sur le système de fichiers.
Une fois que j'ai fini, Cours Get-EventSubscriber | Unregister-Event
pour désinscrire l'événement de l'action. À présent, même si l'indicateur EnableRaisingEvents est vrai et que l'action se produit, l'action ne se déclenchera pas.