• 6 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 23/03/2023

Ajoutez de la logique fonctionnelle pour répondre à des besoins

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 : 

Un arbre de décision si a= 5 est Vrai, on part sur l'instruction 1. Si a = 5 est faux, on part sur l'instruction 2.
Représentation d'une condition

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”
}
10 est identifié comme positif, -5 comme négatif, 0 comme égal à 0 !
Le résultat dans l'invite de commandes

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.

Exemple de certificat de réussite
Exemple de certificat de réussite