Faire dialoguer son script : paramètres et saisie
Notions théoriques
$args, la méthode simple
Write-Host $args[0]
Write-Host $args.Count
$args fonctionne, mais donne des arguments positionnels, non nommés et non typés — l'équivalent direct de $1, $# en Bash. À réserver aux scripts jetables, écrits pour un usage unique et personnel.
param(), la bonne méthode
param(
[string]$Chemin = "C:\Rapports",
[int]$NbProcessus = 5,
[switch]$Detail
)
Le bloc param() doit être la toute première instruction exécutable du script — seuls des commentaires ou la directive #Requires peuvent le précéder.
Une ligne de code (même un simple Write-Host) placée avant le bloc param() provoque une erreur. param() doit toujours ouvrir le fichier.
Typage, valeur par défaut, obligation
[string]$Chemin = "C:\Rapports": un paramètre typé, avec une valeur par défaut si l'appelant ne le fournit pas.[Parameter(Mandatory)]: rend un paramètre obligatoire. S'il manque, PowerShell le demande automatiquement à l'utilisateur avant d'exécuter le script — pas besoin d'écrire soi-même la vérification.[switch]$Detail: un drapeau booléen, activé simplement en écrivant-Detail(sans valeur à fournir), testé ensuite avecif ($Detail) { ... }.
Appeler un script avec des paramètres nommés
.\Get-InfosSysteme.ps1 -Chemin "D:\Temp" -NbProcessus 10 -Detail
Trois avantages sur les arguments positionnels de Bash : l'ordre est libre, la complétion par tabulation fonctionne dans la console, et PowerShell valide le type de chaque paramètre avant même de commencer à exécuter le script.
Validation intégrée (aperçu)
param(
[ValidateSet("Court", "Complet")]
[string]$Mode = "Court",
[ValidateRange(1, 100)]
[int]$Pourcentage,
[ValidateNotNullOrEmpty()]
[string]$Chemin
)
Ces attributs délèguent la validation à PowerShell lui-même, avant l'exécution du corps du script. Nous les approfondirons au niveau 2.
Read-Host
$reponse = Read-Host "Confirmez-vous (O/N)"
Le deux-points final est ajouté automatiquement par Read-Host. Pour un mot de passe :
$motDePasse = Read-Host "Mot de passe" -AsSecureString
Ne jamais écrire un mot de passe en clair dans un script. Pour une authentification programmatique, préférez Get-Credential, qui ouvre une invite sécurisée et renvoie un objet PSCredential.
Quand demander, quand paramétrer
Un script destiné à être planifié automatiquement (via le Planificateur de tâches, par exemple) ne doit jamais attendre de saisie interactive — personne ne sera là pour répondre. Read-Host convient à un script lancé à la main ; param() fonctionne dans tous les cas, planifié ou non.
| Bash | PowerShell |
|---|---|
$1, $@, $# | param() avec des paramètres nommés et typés |
read -p "Question : " reponse | Read-Host "Question" |
echo "Usage : $0 <dossier>" | Aide commentée + Get-Help .\script.ps1 (séance suivante) |
Exemple pratique
<#
Script : Get-InfosSysteme.ps1
Rôle : rapport système paramétrable (v3)
#>
param(
[Parameter(Mandatory)]
[string]$Chemin,
[int]$NbProcessus = 5,
[switch]$Detail
)
Write-Host "Dossier de sortie : $Chemin"
Write-Host "Nombre de processus demandés : $NbProcessus"
if ($Detail) {
Write-Host "Mode détaillé activé" -ForegroundColor Yellow
}
$reponse = Read-Host "Générer le rapport maintenant ? (O/N)"
if ($reponse -eq "O") {
Write-Host "Génération en cours..." -ForegroundColor Green
}
Appels possibles :
.\Get-InfosSysteme.ps1 -Chemin "C:\Rapports"
.\Get-InfosSysteme.ps1 -Chemin "C:\Rapports" -NbProcessus 10 -Detail
Si vous appelez .\Get-InfosSysteme.ps1 sans le paramètre -Chemin (obligatoire), PowerShell vous le demande automatiquement — essayez-le pour voir l'invite générée.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Étape 1 — Ajouter le bloc param()
Vérifiez toujours qu'aucune ligne exécutable (même un commentaire de code actif) ne précède le bloc param() : PowerShell exige qu'il ouvre le script.
Étape 2 — Ajouter un paramètre NbProcessus typé avec valeur par défaut
Typer un paramètre, c'est déléguer sa validation à PowerShell : passer une valeur du mauvais type provoque une erreur claire avant même que le corps du script ne s'exécute.
Étape 3 — Demander confirmation avant d'écrire le fichier
Toute action qui écrit ou modifie des fichiers mérite une confirmation explicite — ou, pour un script non interactif, un paramètre -Force clairement documenté.