Comment écrire votre premier script PowerShell : automatisation du nettoyage de fichiers

L’une des méthodologies de codage les plus importantes à suivre est de s’assurer que vous connaissez et gérez chaque façon dont votre code peut « s’écouler ». Si vous considérez votre code comme un flux, il peut se diviser, revenir à divers points et rencontrer de nombreuses conditions.

La gestion des erreurs garantit que vous mettez en place des « filets » ou un emplacement par défaut vers lequel votre code peut s’écouler lorsque quelque chose d’inattendu se produit.

Utilisons un scénario réel dans lequel vous pourriez vous retrouver, en traitant la gestion des erreurs dans PowerShell.

Construction du script initial pour le nettoyage des fichiers

Nous devons nettoyer quelques anciens fichiers. Notre serveur de fichiers existe depuis longtemps, et nous devons libérer de l’espace. La direction a décidé de supprimer tous les fichiers de plus de quelques jours. Nous devons créer un script qui recherche récursivement un dossier, trouve tous les fichiers plus anciens qu’un certain nombre de jours et les supprime.

La tâche semble assez simple, mais c’est la section sur la gestion des erreurs, donc vous savez que certaines choses vont mal se passer !

Commençons à comprendre la gestion des erreurs en construisant d’abord le script de démonstration du scénario sans gestion des erreurs pour démontrer le problème que la gestion des erreurs résout.

  1. Tout d’abord, ouvrez un nouvel onglet dans VS Code.

    Comme nous essayons juste quelques choses maintenant, nous ne sauvegarderons pas encore le script. Dites temporairement à VS Code que vous êtes sur le point d’écrire du PowerShell.

    Appuyez sur Ctrl-Shift-P, tapez ‘lang’, sélectionnez Choisir le mode de langue, tapez ‘power’, et choisissez PowerShell. Maintenant, VS Code sait que vous allez écrire du PowerShell.

  2. Ensuite, décomposez le problème en tâches, en résolvant d’abord la plus évidente.

    Pour cet exemple, la tâche consiste à trouver une commande pour lire des fichiers dans un répertoire.

    Get-ChildItem -Path C:\AncienDossierOublié
    
  3. Get-ChildItem retourne également des répertoires dont nous n’avons pas besoin, donc limitons cela uniquement aux fichiers.

    Get-ChildItem -Path C:\AncienDossierOublié -File
    
  4. S’il y a des fichiers dans ces sous-répertoires, nous devons aussi les obtenir avec Recurse.

    Get-ChildItem -Path C:\AncienDossierOublié -File -Recurse
    
  5. Maintenant que nous avons la commande et les paramètres, cela renvoie TOUS les fichiers. Nous devons seulement trouver ceux qui sont plus anciens qu’un certain nombre de jours.

    Puisque Get-ChildItem renvoie chaque fichier avec une propriété d’objet LastWriteTime, nous devons filtrer sur cette propriété. Nous allons utiliser le filtre Where pour trouver les fichiers avec un LastWriteTime inférieur à une date spécifiée.

    (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????}
    
  6. La date doit être dynamique car « ancien » aujourd’hui sera différent de « ancien » demain.

    Commentez la ligne précédente car nous en aurons besoin à un moment donné et ensuite, déterminons la situation de la date.

    ## (Get-ChildItem -Path C:\\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????}
    $Maintenant = Get-Date
    $Maintenant
    
  7. Maintenant que nous avons la date d’aujourd’hui, trouvons un nombre spécifique de jours avant aujourd’hui pour obtenir la date. Je vais juste mettre 30 ici temporairement puisque je sais que certains fichiers ont plus de cinq jours pour faire un test rudimentaire.

    ## (Get-ChildItem -Path C:\\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????}
    $Now = Get-Date
    $LastWrite = $Now.AddDays(-30)
    $LastWrite
    
  8. Fait ! Rassemblons ce que nous avons jusqu’à présent.

    $Now = Get-Date
    $LastWrite = $Now.AddDays(-30)
    (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
    

    Nous avons maintenant un petit script qui trouve tous les fichiers dans un répertoire qui sont plus anciens qu’un nombre spécifique de jours.

  9. Ensuite, nous devons ajouter la capacité de supprimer ces fichiers plus anciens. C’est trivial en utilisant la cmdlet Remove-Item et le pipeline.

    $Now = Get-Date
    $LastWrite = $Now.AddDays(-30)
    (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite} | Remove-Item
    
  10. Fait ! Mais attendez, je n’ai aucune idée des fichiers qui ont été supprimés. Il y avait aussi quelques erreurs que nous aborderons dans quelques minutes. Ajoutons quelques fonctionnalités de base.

    $VerbosePreference = 'Continuer'
    
    $Now = Get-Date
    $LastWrite = $Now.AddDays(-30)
    $oldFiles = (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
    foreach ($file in $oldFiles) {
        Remove-Item -Path $file.FullName
        Write-Verbose -Message "Supprimé avec succès [$($file.FullName)]."
    }
    
  11. Vous devrez inclure une boucle comme celle-ci pour exécuter une sorte de code pour chaque fichier. Ici, nous n’utilisons pas le pipeline et plaçons plutôt tous les fichiers trouvés dans une variable oldFiles, un tableau d’objets fichier. Nous exécutons ensuite Remove-Item sur chacun d’eux comme auparavant, mais cette fois en incluant un message détaillé nous indiquant quel fichier est en cours de suppression.

  12. Exécutons maintenant ce code et voyons ce qui se passe.

    Vous pouvez maintenant voir à travers le message détaillé qu’il a supprimé certains fichiers. Le code que nous avons maintenant est le cœur dont nous avons besoin pour créer le script. Créons maintenant un véritable script à partir de cela dans la section suivante.

Maximiser la flexibilité et la réutilisabilité avec des paramètres

Vous avez construit votre script, mais il a encore le potentiel d’être flexible et réutilisable. Comment ? Les paramètres nous permettront de spécifier le répertoire et l’âge des fichiers que nous souhaitons cibler, rendant le script plus flexible.

  1. Avant d’aller plus loin, sauvegardons notre travail. Appelez-le Remove-FileOlderThan.ps1.

    Remarquez le format verbe/nom avec un tiret. Si possible, essayez toujours de créer des noms de script de la même manière que les commandes PowerShell pour la cohérence et la lisibilité.

  2. Tout d’abord, les scripts sont conçus pour être réutilisables. Il est probable que vous souhaitiez utiliser ce script sur différents répertoires et différentes durées. Nous devrons introduire quelques paramètres. Pour ce faire, nous déterminons ce qui changera. Le répertoire et le nombre de jours. Compris.

    param (
        [Parameter(Mandatory)]
        [string]$FolderPath,
    [Parameter(Mandatory)]
    [int]$DaysOld
    

    )

    $Now = Get-Date
    $LastWrite = $Now.AddDays(-30)
    $oldFiles = (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
    foreach ($file in $oldFiles) {
    Remove-Item -Path $file.FullName
    Write-Verbose -Message "Suppression réussie de [$($file.FullName)]."
    }

    Ajoutez un bloc param en haut et définissez chaque paramètre comme obligatoire, car nous devons avoir un chemin et un nombre pour que le script fonctionne. De plus, spécifiez le type ici comme meilleure pratique.

  3. Remplacez les éléments statiques que nous avions dans le code auparavant par les valeurs des paramètres.

    param (
        [Parameter(Mandatory)]
        [string]$FolderPath,
    [Parameter(Mandatory)]
    [int]$DaysOld
    

    )

    $Now = Get-Date
    $LastWrite = $Now.AddDays(-$DaysOld)
    $oldFiles = (Get-ChildItem -Path $FolderPath -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
    foreach ($file in $oldFiles) {
    Remove-Item -Path $file.FullName
    Write-Verbose -Message "Supprimé avec succès [$($file.FullName)]."
    }

  4. Exécutons maintenant le script et voyons ce qui se passe.

    C:\Scripts\Remove-FileOlderThan.ps1 -FolderPath C:\OldForgottenFolder -DaysOld 30 -Verbose
    

    Vous pouvez voir comment nous devons spécifier le chemin du dossier et le nombre de jours comme paramètres. Utilisez le paramètre Verbose pour voir cette ligne Write-Verbose.

    PowerShell a exécuté le script exactement comme avant, mais nous avons maintenant un script paramétré que nous pouvons utiliser sur n’importe quel répertoire ou n’importe quel âge de fichiers !

    En regardant la sortie, nous avons rencontré du texte rouge. Soit vous n’avez pas les droits, soit le fichier est en lecture seule. Mais sur quels fichiers cela a-t-il échoué ? Et comment vous assurez-vous que ces fichiers sont également supprimés ?

    Conclusion

    Dans ce tutoriel, nous avons créé un script pour nettoyer les anciens fichiers d’un répertoire, en garantissant la flexibilité en ajoutant des paramètres. Bien que le script fonctionne comme prévu, nous avons vu que la gestion des erreurs n’était pas encore abordée, ce qui est crucial lorsque l’on traite des scénarios du monde réel.

    Alors que nous avançons, ajouter une gestion des erreurs nous permettra de gérer les problèmes, tels que des cmdlets lançant des erreurs ou des fichiers étant inaccessibles, nous aidant à éviter la terminaison du script et fournissant des informations détaillées sur ce qui s’est mal passé.

    Restez à l’écoute pour la prochaine démo ! PowerShell 101 : Erreurs terminantes, non-terminantes, et Try/Catch.

Source:
https://adamtheautomator.com/powershell-file-cleanup-script/