Depuis le début de cette partie, vous avez appris à développer des scripts interactifs, commentés au mieux, avec des variables explicites, et vous avez même été jusqu’à créer des fonctions !
Vos scripts interactifs fonctionnent bien, mais ne permettent de travailler que sur un élément à la fois. Vous allez dans ce chapitre-ci apprendre à ajouter de la logique fonctionnelle dans vos scripts.
Testez vos conditions
Imaginez, vous êtes à vélo en balade, et vous arrivez à une intersection.
Vous vous dites la chose suivante : “Si je vais à droite, je vais sur le sentier côtier, sinon, je vais sur la piste cyclable qui me guidera jusqu’au prochain village”.
Autre exemple, peut-être plus en lien avec notre domaine : “Si la valeur de ma variable est supérieure à 10, je fais une action, sinon j’en fais une autre”.
Ces deux exemples correspondent à ce qu’en scripting, nous allons nommer une structure conditionnelle.
Si vous deviez utiliser une représentation plus visuelle, une condition est symbolisée de la manière suivante par la norme ISO 5807, qui définit les organigrammes de programmation :
La structure conditionnelle fonctionne de manière très étroite avec le type de variable Booléen. Le booléen est un type de variable qui ne peut avoir que 2 valeurs : Vrai, ou Faux (ou ses déclinaisons True/False, ou encore 1 et 0).
Le bloc if{}…else{}
Dans le cas de besoin de structure conditionnelle, ce bloc sera le plus spontané et le plus souvent utilisé.
Il peut être traduit par :
Si… Sinon
Sa syntaxe est simple :
if (<test==true>;) {
instructions
}
else {
instructions
}
Par exemple, nous allons imaginer que vous vouliez tester si un nombre entré par l’utilisateur est positif, c'est-à-dire strictement supérieur à 0 :
[int]$nombreEntre = Read-Host “Entrez un nombre”
if ( $nombreEntre -gt 0 )
{
Write-Host “Vous avez entré un nombre positif”
}
Dans ce premier cas de figure, vous effectuez un test, et l’action qui en découle sera effectuée uniquement si le résultat du test est vrai.
Vous pouvez aussi décider d’effectuer une action différente dans le cas où le nombre est négatif ou égal à zéro. Dans ce cas, il suffit d’ajouter le bloc else{} après, pour gérer le cas de figure où le test n’est plus Vrai (true), mais Faux (false).
[int]$nombreEntre = Read-Host “Entrez un nombre”
if ( $nombreEntre -gt 0 )
{
Write-Host “Vous avez entré un nombre positif”
}
else
{
Write-Host “Votre nombre est égal à zéro ou négatif”
}
D’accord, mais comment je fais si je veux gérer le cas où le nombre entré est égal à 0 ?
Excellente question ! Dans ce cas, il vous faudrait pouvoir dire par exemple “Si… sinon si… sinon”.
Et comment formuler ce “Sinon si” ?
Tout simplement grâce au bloc elseif{} : celui-ci couple le fonctionnement du else ET du if.
Dans notre précédent exemple, le résultat donnerait :
[int]$nombreEntre = Read-Host “Entrez un nombre”
if ( $nombreEntre -gt 0 )
{
Write-Host “Vous avez entré un nombre positif”
}
elseif ($nombreEntre -eq 0)
{
Write-Host “Votre nombre est égal à 0”
}
else
{
Write-Host “Votre nombre est négatif”
}
Plusieurs tests, en plus de -eq, sont disponibles ; par exemple :
Test | Résultat | Exemple |
-eq | Est égal à | 1 -eq 1 |
-gt | Supérieur à | 2 -gt 1 |
-ne | Non égal à | 0 -ne 2 |
-ge | Supérieur ou égal à | 2 -ge 1 |
-lt | Inférieur à | 1 -lt 2 |
-le | Inférieur ou égal à | 2 -le 2 |
-like | Caractère générique, sans respect de la casse | "bonjour" -like "bonjour" |
-ilike | Caractère générique, sans respect de la casse | "bonjour" -like "Bonjour" |
-clike | Caractère générique, avec respect de la casse | "Bonjour" -clike "Bonjour" |
-notlike | Caractère générique sans correspondance, sans respect de la casse | "bonjour" -like "au revoir" |
-is | De type | "bonjour" -is [String] |
-isnot | Non de type | "bonjour" -isnot [int] |
Le bloc Switch
Vous êtes en train de développer un script interactif avec un menu de démarrage du style :
Entrez “ajouter” pour ajouter un utilisateur
Entrez “supprimer” pour supprimer un utilisateur
Entrez “modifier” pour modifier un utilisateur
Entrez “afficher” pour afficher les informations d’un utilisateur
À votre avis, comment vous pourriez gérer ça ?
Spontanément, avec des blocs if{}...elseif{}...else{} ce serait réalisable.
Mais vous vous retrouveriez rapidement avec beaucoup de lignes de code et des elseif{} en pagaille. C’est possible, mais ce n’est pas ce qu’on peut faire de mieux en matière de lisibilité.
Une autre structure conditionnelle existe. Il s’agit du bloc Switch{}.
$action=Read-Host "entrez l'action (ajouter/supprimer/modifier/afficher) à effectuer"
switch -Exact ($action)
{
'ajouter' {Write-Host "Vous avez choisi l'action Ajouter"}
'supprimer' {Write-Host "Vous avez choisi l'action Supprimer"}
'modifier' {Write-Host "Vous avez choisi l'action Modifier"}
'afficher' {Write-Host "Vous avez choisi l'action Afficher"}
}
Avec une structure de ce type, dans chaque bloc correspondant à une action, vous allez pouvoir définir une ou plusieurs instructions.
À vous de jouer !
Vous allez devoir essayer de créer un petit jeu de pile ou face, c'est-à-dire qu’il va générer un choix, pile ou face, avec la cmdlet Get-Random
, et le joueur (vous) devra choisir si c’est pile ou face.
Si c’est pile, vous gagnez, si c’est face… vous gagnez tout de même, car vous avez réussi à développer le script !
*
*
*
*
*
Et voilà la correction !
<#
Description : Script de jeu "trouver le nombre secret"
Usage : PileOuFace.pls1
Auteur : Stiven G.
Version : 0.1
Révisions :
-0.1 (25/11/2022) : Version Initiale
#>
$aDeviner = "pile", "face" | Get-Random #Sélectionne pile ou face de manière aléatoire
$choixEntre = Read-Host "Entrez Pile ou face ?" #Le joueur écrit pile ou face
#Test de la valeur du nombre entré
If ($choixEntre -like $aDeviner) {
Write-Host "Vous avez gagné !"
}
Else{
Write-Host "Pas de chance, c'était l'autre !"
}
En résumé
Un test, ou une condition, permet de vérifier si quelque chose est vrai ou faux.
Il existe au moins deux types de structures conditionnelles : les bloc if…then…else et les blocs Switch.
Les tests vont toujours de pair avec les booléens true ou false.
Les opérateurs de comparaison permettent de définir la condition à mettre en place.
Vous savez maintenant comment aider votre script à prendre la bonne décision pour son traitement. Vous allez désormais pouvoir lui faire traiter plusieurs données à l’aide des boucles.