Le tube (| pipe, barre verticale) sert à rediriger la sortie standard d'une commande (l'affichage) vers l'entrée standard de la commande suivante (les paramètres).
Le point virgule (;) sert à écrire plusieurs commandes indépendantes sur une même ligne.
Visuellement, ces deux symboles peuvent se confondre. c'est pourquoi, on n'utilise le ; que dans des cas rares ou pour brouiller volontairement le code.
Exemples d'utilisation :
# ===========================================# exemple pour le tube : ls monRep |Write-outputrmDir-Recurse monRep | Wrtie-output >> log.txt
# exemple pour le point-virgule : $messageCompte=" Entrez le nom du nouveau compte" : $messagePwd="Mot de passe ?"$nom=Read-Host$message ; new-ADuser-Name$nom-AccountPassword (Read-Host-AsSecureString$messagePwd)# ===========================================
Redirection :
La redirection est identique au DOS :
# ===========================================dir> lst.txt # > Vide ou crée le fichier lst.txt et y ajoute la sortie de dir.dir>> lst.txt # >> Ajoute la sortie de dir à la suite du contenu du fichier lst.txt.# ===========================================
Tester une commande - $?
Si une commande s'est bien/mal déroulée, on effectue un traitement ou pas.
Si la cde1 s'est bien déroulée alors cde2 s'exécute (cde1 et cde2)
Les opérateurs de test permettent de faire des comparaisons entre deux opérandes. Certaines commandes produisent aussi des résultats booléens (vrai/faux).
Les opérateurs booléens permettent d'associer deux comparaisons pour en faire une condition plus complexe. Le résultats est toujours booléen (vrai/faux).
Opérateurs de comparaison
Test
Équivalent mathématique
-eq
= ; a est-il égal b ?
-ne
<> : différent
-gt
> : a est-il supérieur à b ?
-ge
>= : supérieur ou égal
-lt
< : inférieur à
-le
<= ; a inférieur ou égal à b
-like
"comme", "ressemble à". Permet d'utiliser les jokers * et ? pour trouver des chaînes correspondant à un masque simple
-match
"correspond", permet de définir une expression régulière pour comparer des chaînes à un masque avancé
Les connecteurs de comparaisons entre elles (voir aussi les tables de vérité)
-or
OU, a ou b ; toujours vrai sauf si les deux opérandes sont fausses.
-and
ET, a et b ; vrai seulement si les deux opérandes sont vraies, sinon faux
-not ou !
non vrai = faux ; inverse le résultat booléen
-xor
OU exclusif, vraie seulement si les deux opérandes sont différentes
Ajouter un c devant la commande pour la rendre sensible à la casse des chaînes ("toto" -ceq "Toto" ==> false)
Il existe aussi des commandes dont le résultat est booléen (vrai ou faux)
Exemple (trrrès utile) :
Test-Path C:\Scripts\Archive est vrai si l'objet Archive existe
Exercices : gestion de fichier
Rédiger le code nécessaire pour copier de c:\temp\ vers c:\sav\
A) les .txt de temp qui commencent par aa ou bb
#--- Indices ---Get-ChildItem c:\temp\
|Where-object ...
|copy ...
#----------------
B) les .txt de temp qui existent déjà dans sav
Utiliser la commande : Split-path -Path "c:\sav\*.txt" -Leaf -Resolv pour récupérer la liste des noms seuls des fichiers de -Path.
Get-ChildItem récupère des objets fichier d'où il faut extraire le seul nom du fichier. C'est un poil plus compliqué.
#--- Indices ---Split-Path-Path" ... "-Leaf-Resolve|foreach{ ... }#----------------
Les Structures : if, do, for, while
Dans un bloc, il est recommandé d'amaliorer la lisibilité du code en effectuant un retrait, une indentation des lignes qui sont à l'intérieur du bloc. Les blocs sont délimités par des accolades.
Par exemple :
#----------------$k0=0$k1=1for($i=0;$i<10;$i++){# début du blocwrite-host"À l'indice $i, k est égal à $k."$k0=$k0+$k1}# fin du blocif($k0-gt100)write-host"résultat très grand"#----------------
Si on écrit une commande sur plusieurs lignes, on fait de même.
DO, Bloc d'instructions
Un bloc d'instructions est un ensemble d'instructions entourées d'accolades.
Un bloc d'instructions sert à présenter un traitement complexe dans les structures. Le mot clé DO permet de construire des blocs indépendants.
C'est très utilisé dans les alternatives et les boucles, les fonctions.
Mots clés : DO, {...}.
Exemple :
#----------------DO{
plusieurs instructions et commandes
}# ou simplement{
plusieurs instructions et commandes
}#----------------
If, alternative
Une alternative est une instruction qui permet de choisir entre deux traitements selon le résultat d'une condition
Une alternative peut contenir un ou plusieurs traitements : si (condition1) alors TTmt1, sinon-si (condition2) alors ttmt2, ..., sinon ttmtn, fin si.
Mots clés : IF, ELSE, ELSEIF, utilise les blocs {...}.
Exemple :
#----------------$r=Read-Hostif($r-eq"10"){"Le nombre est 10."}elseif($r-eq"5"){"Le nombre est 5."}else{"Le nombre n'est ni 5 ni 10."}#----------------
FOR, boucle de comptage
POUR a=départ, Tant que a
Une boucle de comptage effectue un nombre défini d'itérations entre deux bornes selon un pas imposé.
On détermine une borne de départ qui initialise un indice, une borne de fin à laquelle est comparée l'indice et un calcul qui défini le pas, le saut entre deux itérations de la boucle.
Mots clés : FOR, utilise des blocs {...} et souvent un opérateur d'incrémentation : ++ ou --.
Exemple :
#----------------# Afficher les nombres de 1 à 7for($i=1 ; $i-le7 ; $i++){"Le chiffre est $i"}#----------------
ForEach, boucle de parcours de liste
POUR CHAQUE élément d'une liste, exécuter l'instruction ou le bloc d'instructions demandé.
Une boucle de parcours effectue autant d'itérations que d'éléments dans la liste.
Une variable prend successivement la valeur de chaque élément de la lliste.
Mots clés : FOREACH, utilise des blocs {...} et souvent un tube (|).
Exemple :
#----------------# Afficher les nombres de 1 à 7$valeurs=1,2,3,4,5,6,7# soit le tableau initial de 7 valeursforeach($valeurin$valeurs){# Pour Chaque valeur du tableau"Le chiffre est $valeur"# exécuter le traitement avec la valeur courante}# fin Pour Chaque#------------------------------------# Écriture alternative avec un tube(1..7)|foreach{"Le chiffre est $_"}#----------------
Exemple : créer les répertoires des utilisateurs de la liste contenue dans un fichier.
#----------------# récupérer la liste contenue dans le fichier$liste=get-content listeLogin.txt
# pour chaque utilisateur de la liste, créer son répertoireForeach($valin$liste){mkdir/users/$_}#------------------------------------# Écriture alternative avec un tubegc listeLogin.txt |foreach{mkdir/users/$_}#----------------
WHILE : Tant que, boucle complexe
Il existe deux façons d'écrire cette boucle avec deux manières de penser différentes.
While simple
: Tant que je gagne, je joue.
do ... while
: Je joue, tant que je gagne.
Exemples : compter de 1 à 7 :
#----------------# Tant que i est inférieur à 8, écrire i$i=1while($i-le7){Write-Host"Le chiffre est $i"$i++}#----------------
La condition est une condition de continuation
Boucle la plus utilisée
#----------------# Tant que i est inférieur à 8, écrire i$i=1do{Write-Host"Le chiffre est $i"$i++}while($i-lt8)#----------------
La condition est une condition après 1ère exécution de la boucle
Attention à toujours utiliser des comparateurs d'inégalité (-le, -ge, -lt, -gt) pour éviter tout risque de boucle infinie !!!
Exercices : Petit jeu de devinette
Un utilisateur doit deviner un entier aléatoire entre 0 et 9.
Algorithme global
Choisir un entier aléatoire entre 0 et 9 avec la commande : get-random 10
Demander un entier à l'utilisateur,
Répondre "trop haut" ou "trop bas" si le nombre n'est pas trouvé et reposer la question
Répondre "Gagné" et s'arrêter, si le nombre est trouvé.
Rédiger le code correspondant
Améliorations possibles
[important] Tant que la réponse de l'utilisateur n'est pas un nombre, dans l'intervalle défini, reposer la question
Si l'utilisateur répond "Q" ou "q", arrêter le programme