Aller au contenu principal

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.

attention

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 avec if ($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
attention

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.

Et en Bash ?
BashPowerShell
$1, $@, $#param() avec des paramètres nommés et typés
read -p "Question : " reponseRead-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
astuce

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


Où doit se trouver le bloc param() dans un script PowerShell ?


Comment appeler un script avec le paramètre -Chemin valant C:\Temp ?


À quoi sert [switch]$Detail dans un bloc param() ?


Que se passe-t-il si un paramètre marqué [Parameter(Mandatory)] n'est pas fourni à l'appel ?


Quelle cmdlet demande une saisie interactive à l'utilisateur ?


TP pour réfléchir et résoudre des problèmes

Étape 1 — Ajouter le bloc param()


Bonne pratique - param() en première instruction

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


Bonne pratique - Typer ses paramètres

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


Bonne pratique - Confirmer avant d'agir

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é.

📌 Une solution