Introduction
PowerShell est devenu l'outil incontournable pour l'automatisation des tâches d'administration système et DevOps. En 2026, les exigences portent sur des scripts robustes, maintenables et réutilisables. Ce tutoriel vous guide pas à pas dans la création de scripts avancés exploitant les fonctionnalités modernes de PowerShell 7 : fonctions avec CmdletBinding, classes POO, gestion centralisée des erreurs et création de modules professionnels. Chaque exemple est immédiatement exécutable et adapté à des environnements de production.
Prérequis
- PowerShell 7.4 ou supérieur installé
- Connaissances intermédiaires en PowerShell (fonctions, pipelines)
- Éditeur VS Code avec extension PowerShell
- Droits d'exécution de scripts (Set-ExecutionPolicy)
Fonction avancée avec CmdletBinding
function Get-SystemInfo {
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string[]]$ComputerName,
[switch]$IncludeProcesses
)
begin {
Write-Verbose "Début de la collecte d'informations"
}
process {
foreach ($computer in $ComputerName) {
$os = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $computer
$result = [PSCustomObject]@{
ComputerName = $computer
OSVersion = $os.Version
Uptime = (Get-Date) - $os.LastBootUpTime
}
if ($IncludeProcesses) {
$result | Add-Member -MemberType NoteProperty -Name Processes -Value (Get-Process -ComputerName $computer)
}
Write-Output $result
}
}
}Cette fonction utilise CmdletBinding pour supporter -Verbose et -Debug. Les paramètres sont fortement typés et le pipeline est géré via process. L'objet retourné est structuré pour une utilisation ultérieure.
Validation avancée des paramètres
function Get-SystemInfo {
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[ValidatePattern('^[A-Za-z0-9-]+$')]
[string[]]$ComputerName,
[ValidateRange(1, 100)]
[int]$Timeout = 30
)
# Corps de la fonction inchangé
}ValidatePattern et ValidateRange évitent les entrées invalides avant exécution. Ces attributs fournissent des messages d'erreur clairs et automatiques.
Gestion centralisée des erreurs
function Invoke-SafeCommand {
[CmdletBinding()]
param([scriptblock]$ScriptBlock)
try {
& $ScriptBlock
}
catch [System.Management.Automation.RuntimeException] {
Write-Error "Erreur d'exécution : $($_.Exception.Message)" -ErrorAction Stop
}
catch {
Write-Error "Erreur inattendue : $($_.Exception.Message)" -ErrorAction Stop
}
finally {
Write-Verbose "Exécution terminée"
}
}La structure try/catch/finally avec typage spécifique des exceptions garantit une gestion précise et la possibilité d'arrêter le script via ErrorAction Stop.
Définition d'une classe PowerShell
class SystemReport {
[string]$ComputerName
[datetime]$Timestamp
hidden [int]$InternalId
SystemReport([string]$name) {
$this.ComputerName = $name
$this.Timestamp = Get-Date
$this.InternalId = Get-Random
}
[string] ToString() {
return "Rapport pour $($this.ComputerName) généré le $($this.Timestamp)"
}
}Les classes permettent une approche orientée objet avec encapsulation. Le mot-clé hidden protège les propriétés internes tout en conservant la lisibilité du code.
Création d'un module PowerShell complet
function Get-SystemInfo { <# code de la fonction ici #> }
function Invoke-SafeCommand { <# code ici #> }
Export-ModuleMember -Function Get-SystemInfo, Invoke-SafeCommand
# Fichier .psd1 associé :
# @{ ModuleVersion = '1.0.0'; RootModule = 'MyAdminTools.psm1'; FunctionsToExport = '*' }Un module bien structuré expose uniquement les fonctions publiques via Export-ModuleMember. Le fichier manifeste .psd1 versionne et documente le module pour une distribution professionnelle.
Bonnes pratiques
- Toujours utiliser [CmdletBinding()] et des paramètres typés
- Implémenter une gestion d'erreurs explicite avec try/catch
- Documenter chaque fonction avec des commentaires help
- Versionner les modules et utiliser un manifeste .psd1
- Tester systématiquement avec Pester avant déploiement
Erreurs courantes à éviter
- Omettre le support du pipeline dans les fonctions avancées
- Utiliser Write-Host au lieu de Write-Output ou Write-Verbose
- Ne pas valider les entrées utilisateur avec des attributs Validate*
- Ignorer la gestion des sessions distantes avec Enter-PSSession ou Invoke-Command
Pour aller plus loin
Approfondissez vos compétences avec nos formations certifiantes sur l'automatisation PowerShell et DevOps. Découvrez nos formations Learni.