Paramètres de fonction PowerShell : Un guide pratique pour créer de meilleures fonctions

Construire des fonctions dans PowerShell est un excellent moyen de rendre vos scripts modulaires et réutilisables. Mais si vous voulez que ces fonctions soient adaptables dans différents scénarios, ajouter des paramètres de fonction peut les amener à un niveau supérieur.

Dans ce tutoriel, nous allons étendre une fonction de journalisation de base en ajoutant des paramètres pour contrôler le message de journal, le chemin du fichier et la validation.

À la fin, vous verrez comment les paramètres peuvent rendre vos fonctions polyvalentes, résistantes aux erreurs et des ajouts puissants à votre boîte à outils PowerShell.

Définir la fonction de base Write-Log

Nous allons commencer par une fonction de base qui prend un seul paramètre d’entrée pour le message de journal et l’ajoute à un fichier journal standard avec un horodatage.

Dans cet exemple :

  • Le paramètre $LogMessage est marqué comme obligatoire, donc PowerShell vous le demande si vous ne fournissez pas de valeur.
  • Chaque entrée de journal inclut un horodatage formaté en HH:mm:ss.
function Write-Log {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$LogMessage
    )
    $timeGenerated = Get-Date -Format HH:mm:ss
    Add-Content -Path "C:\Scripts\software_installer.log" -Value "$timeGenerated - $LogMessage"
}

Tester la fonction Write-Log

Maintenant que la fonction Write-Log a une structure de base et accepte des paramètres, il est temps de tester sa fonctionnalité. Le test permet de s’assurer que chaque aspect de la fonction, des paramètres par défaut aux entrées personnalisées, fonctionne comme prévu et gère les erreurs avec grâce.

Testez la fonction Write-Log en l’appelant avec un message personnalisé :

Write-Log -LogMessage 'Testing a new log message'

Cette commande ajoute une nouvelle entrée avec un horodatage au fichier journal (C:\Scripts\software_installer.log).

Quelques éléments à noter concernant la fonction Write-Log :

Standardized Information Logging By setting a default path for the log file, you don’t have to specify the file name every time you call the function. This standardizes all log information to a single file, keeping your logs organized.
Processus de journalisation simplifié La fonction abstrait les détails tels que l’obtention de la date et de l’heure actuelles avec Get-Date et l’ajout de contenu avec Add-Content. En tant qu’utilisateur de la fonction, vous pouvez vous concentrer uniquement sur l’écriture de messages dans le fichier journal sans avoir besoin de vous souvenir de ces détails.
Meilleure lisibilité du code La fonction enregistre explicitement des messages dans un fichier journal désigné, ce qui rend clair que l’objectif est la journalisation plutôt que simplement l’écriture dans un fichier texte générique. Cela rend le code plus explicite et plus facile à comprendre d’un seul coup d’œil.

Avec ces améliorations, la fonction Write-Log contribue à rationaliser les tâches de journalisation, rendant les scripts plus propres et plus faciles à maintenir.

Vous pouvez consulter le dernier message du journal en vérifiant le contenu du fichier journal:

Get-Content -Path "C:\Scripts\software_installer.log"

Cette commande affiche toutes les entrées du journal, y compris votre dernier message avec un horodatage.

Mais peut-être avez-vous appelé Write-Log par accident sans un paramètre LogMessage:

Write-Log

Vous remarquerez que—parce que LogMessage est requis—PowerShell empêchera la fonction de s’exécuter. Cependant, si LogMessage n’était pas obligatoire, un message vide serait écrit, créant une entrée « oops » non intentionnelle.

Vérifiez le résultat en vérifiant à nouveau le fichier journal:

Get-Content -Path "C:\Scripts\software_installer.log"

Ajout de flexibilité avec un chemin de fichier journal personnalisé

Alors que la fonction fonctionne très bien, rendons-la encore plus flexible en ajoutant un paramètre $LogFilePath. Ce paramètre vous permet de spécifier un chemin de fichier personnalisé tout en fournissant un chemin par défaut.

function Write-Log {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$LogMessage,

        [Parameter()]
        [string]$LogFilePath = 'C:\Scripts\software_installer.log'
    )
    $timeGenerated = Get-Date -Format HH:mm:ss
    Add-Content -Path $LogFilePath -Value "$timeGenerated - $LogMessage"
}

Remarquez que $LogFilePath a un chemin par défaut de C:\Scripts\software_installer.log, mais vous pouvez fournir n’importe quel chemin valide.

Pour spécifier un chemin de fichier différent, appelez Write-Log de cette manière :

Write-Log -LogMessage 'Custom path log message' -LogFilePath 'C:\Scripts\custom_log.log'

Contrôler le chemin de fichier avec ValidateScript

Vous ne voulez pas que votre fonction enregistre des fichiers qui n’existent pas. À cette fin, vous pouvez vous assurer que le fichier existe avant de le journaliser en utilisant l’attribut de paramètre ValidateScript. Cet attribut vous permet d’exécuter du code sur la valeur d’un paramètre, en le vérifiant avant d’exécuter la fonction.

function Write-Log {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$LogMessage,

        [Parameter()]
        [ValidateScript({ Test-Path -Path $_ })]
        [string]$LogFilePath = 'C:\Scripts\software_installer.log'
    )
    $timeGenerated = Get-Date -Format HH:mm:ss
    Add-Content -Path $LogFilePath -Value "$timeGenerated - $LogMessage"
}

Avec ValidateScript, Write-Log vérifie que le chemin de fichier que vous fournissez existe. Si le fichier n’existe pas, PowerShell s’arrête et renvoie une erreur.

Vous pouvez créer un fichier vide avant de l’appeler pour vous assurer que la fonction fonctionne comme prévu :

Set-Content -Path 'C:\Scripts\softwarex_installer.log' -Value ''
Write-Log -LogMessage 'Log entry in a new file' -LogFilePath 'C:\Scripts\softwarex_installer.log'

Tester la fonctionnalité et les validations de Write-Log

Après avoir ajouté des flexibilités à votre fonction, il est naturel de tester si elle fonctionne comme prévu. Vous devez garantir une fonctionnalité de journalisation robuste en examinant l’attribut ValidateScript et voir comment il améliore votre fonction Write-Log.

Voyons comment ValidateScript fonctionne en essayant de journaliser dans un fichier inexistant :

Write-Log -LogMessage 'Finishing install...' -LogFilePath 'C:\Scripts\softwarex_installer.log'

Dans ce cas, l’attribut ValidateScript vérifie si le chemin du fichier journal spécifié existe en appelant Test-Path. Si le chemin n’existe pas, la fonction renvoie une erreur.

La fonction échoue car C:\Scripts\softwarex_installer.log n’existe pas. Vous pouvez le vérifier en exécutant manuellement Test-Path:

Test-Path 'C:\Scripts\softwarex_installer.log'

Étant donné que Test-Path renvoie $false, le fichier est effectivement manquant.

Pour corriger cela, créez un fichier journal vierge et testez à nouveau.

Set-Content -Path 'C:\Scripts\softwarex_installer.log' -Value ''
Write-Log -LogMessage 'Finishing install...' -LogFilePath 'C:\Scripts\softwarex_installer.log'

Maintenant, la fonction fonctionne comme prévu.

Confirmez le résultat en consultant le fichier journal:

Get-Content -Path 'C:\Scripts\softwarex_installer.log'

L’utilisation de ValidateScript et d’autres attributs de validation des paramètres permet de garantir l’utilisation correcte des paramètres de fonction, réduisant les erreurs et rendant vos fonctions PowerShell plus fiables.

Conclusion

Ajouter des paramètres aux fonctions PowerShell améliore grandement leur flexibilité et leur utilité. Avec une combinaison de valeurs par défaut, d’attributs obligatoires et de validations, vos fonctions peuvent traiter une variété d’entrées tout en maintenant la fiabilité.

En utilisant ces techniques, vous pouvez désormais créer des fonctions évolutives et conviviales qui s’intègrent parfaitement dans différents scripts.

Développez ces compétences en créant des outils PowerShell plus avancés pour rationaliser et améliorer votre flux de travail. Consultez ce tutoriel sur les Paramètres PowerShell et approfondissez vos connaissances sur les paramètres de fonction!

Source:
https://adamtheautomator.com/powershell-function-parameters/