Opérateurs
Introduction
Il existe de très nombreux types d’opérateurs, mais qu’ils soient arithmétiques, binaires, logiques ou autres, tous permettent d’agir sur les variables. Gardez bien à l’esprit que connaître et maîtriser ces différents opérateurs est essentiel pour l’élaboration d’un bon script.
1. Opérateurs arithmétiques
En ce qui concerne les opérations arithmétiques, PowerShell traite les expressions de gauche à droite en respectant les règles des propriétés mathématiques ainsi que les parenthèses.
Exemple
PS > 2+4*3
14
PS > (2+4)*3
18
La liste des opérateurs arithmétiques disponibles vous est donnée ci-dessous :
Signe |
Signification |
+ |
Addition |
- |
Soustraction |
* |
Multiplication |
/ |
Division |
% |
Modulo |
Les quatre premiers opérateurs doivent logiquement vous sembler familiers, quant au dernier, l’opérateur modulo, celui-ci permet de retourner le reste d’une division entière de a par b.
Par exemple, en tapant 5%3 dans la console, nous obtenons 2. Tout simplement parce qu’il y a 1 fois 3 dans 5 et que le reste de la division vaut 2.
Vous constaterez que les opérations arithmétiques s’appliquent également aux variables. Ainsi, $var1 + $var2 vous retournera la somme des deux variables si elles contiennent...
Opérateurs de comparaison
Avec un nom aussi évocateur, inutile de préciser que les opérateurs de comparaison permettent de comparer des données entre elles. Contrairement à d’autres langages, PowerShell utilise les mêmes opérateurs que ce soit pour comparer des nombres, des chaînes de caractères, ainsi que pour effectuer des recherches d’éléments dans un tableau.
Voici l’ensemble des opérateurs de comparaison :
Opérateur |
Signification |
-eq |
Égal |
-ne |
Non égal (différent) |
-gt |
Strictement supérieur |
-ge |
Supérieur ou égal |
-lt |
Strictement inférieur |
-le |
Inférieur ou égal |
Important : il faut connaître une petite subtilité du langage qui fait que les opérateurs n’ont pas le même comportement lorsqu’ils sont appliqués à une valeur scalaire ou à un tableau. En effet, appliqués à un scalaire, les opérateurs retournent une valeur booléenne, ce qui n’est pas le cas avec un tableau.
1. Comparaison sur des scalaires
Une valeur scalaire est une valeur atomique, telle qu’un nombre, un caractère ou une chaîne de caractères. On oppose généralement les tableaux aux scalaires, tableaux qui contiennent généralement (mais pas tout le temps) des valeurs scalaires....
Opérateurs de comparaison générique
Une expression générique est une expression qui contient un caractère dit « générique ». Par exemple, l’étoile (*) remplace n’importe quelle suite de caractères, et le point d’interrogation (?) se substitue à un caractère unique.
Comme les opérateurs de comparaison précédents, les opérateurs génériques ne retournent pas le même type de données selon qu’ils sont appliqués à une valeur scalaire ou à un tableau.
Il existe deux opérateurs de comparaison permettant de comparer une chaîne avec une expression générique.
Opérateur |
Signification |
-like |
Comparaison d’égalité d’expression générique. |
-notlike |
Comparaison d’inégalité d’expression générique. |
Pour mieux comprendre l’utilisation de ces opérateurs, voici quelques exemples d’applications :
# Opérations sur scalaires
PS > 'Powershell' -like '*shell'
True
PS > 'powershell' -like 'power*'
True
PS > 'Powershell' -clike 'p*shell'
False
PS > 'powershell' -like '*war*'
False
PS >...
Opérateur de comparaison des expressions régulières
Les expressions régulières (regex) sont bien connues des administrateurs systèmes Unix/Linux, mais généralement beaucoup moins connues des administrateurs Windows. La raison vient du fait que les premiers sont habitués à manipuler du texte avec des outils en ligne de commandes usuels tels que grep, awk, tail, etc.
Les expressions régulières représentent un métalangage extrêmement puissant dédié à la manipulation des chaînes de caractères. On les utilise pour comparer des chaînes et/ou pour capturer des chaînes de caractères répondant à un modèle spécifique à l’intérieur de fichiers texte.
Les expressions régulières sont, dans les années 1950, sorties de la tête d’un mathématicien chevronné, puis implémentées dans les années 70 dès les premières versions d’Unix. C’est peut-être la raison pour laquelle leur syntaxe peut paraître assez cabalistique au premier abord, mais ne vous laissez pas impressionner !
Nous vous invitons à consulter l’aide en ligne et en particulier la rubrique d’aide about_Regular_Expression qui constitue une entrée en matière intéressante.
PowerShell dispose des deux opérateurs de comparaison d’expressions régulières suivants :
Opérateur |
Signification |
-match |
Comparaison d’égalité entre un pattern et une expression régulière. |
-notmatch |
Comparaison d’i négalité entre un pattern et une expression régulière. |
Le principe des expressions régulières est de faire correspondre un modèle (appelé « pattern » en anglais) avec une chaîne de caractères. Elles permettent d’analyser de grandes quantités de données, et ce de manière très performante et en un minimum d’efforts (lorsqu’on les maîtrise).
Le principal inconvénient est que le modèle peut vite devenir très complexe, et être encore plus difficile à déchiffrer et à maintenir plusieurs mois après l’avoir écrit ;...
Opérateur de plage
L’opérateur de plage se note .. (prononcez « point point »). Il permet, comme son nom l’indique, de couvrir une plage de valeurs. Admettons que nous souhaitions couvrir une plage de valeurs allant de 1 à 10 (pour réaliser une boucle par exemple), eh bien il suffit de taper la ligne qui suit :
PS > 1..10
1
2
3
..
10
On peut, de la même manière, définir une plage dynamiquement en utilisant des variables. Rien ne vous empêche de définir une plage allant de $var1 à $var2 si ces valeurs sont des entiers.
Exemple
PS > $var1 = 5
PS > $var2 = 10
PS > $var1 .. $var2
5
6
7
8
9
10
Opérateurs d’appartenance
En PowerShell, on parle souvent de collection d’objets ou de tableau d’objets. L’opérateur d’appartenance, introduit depuis PowerShell 3.0, permet de savoir si oui ou non un objet est présent dans une collection.
Opérateur |
Signification |
-in |
Teste si une valeur est dans une collection. |
-notIn |
Teste si une valeur n’est pas dans une collection. |
Pour mieux comprendre l’utilisation de ces opérateurs, voici quelques exemples d’applications :
PS > 'shell' -in 'Console', 'shell'
True
PS > 'shell' -in 'Console', 'powershell'
False
PS > 85 -in 1..99
True
L’opérateur jumeau de -in est l’opérateur -contains. En effet, il fonctionne comme -in mais de façon inverse. Libre à vous de choisir celui qui correspond le mieux à la logique de votre script.
Opérateur |
Signification |
-contains |
Teste si une collection contient une valeur particulière. |
-notContains |
Teste si une collection ne contient pas une valeur particulière. |
Pour mieux comprendre l’utilisation de ces opérateurs, voici quelques exemples d’applications :
PS > 'Console', 'shell' -contains 'shell'
True
PS > 'Console', 'powershell' -contains 'shell'...
Opérateur de remplacement
L’opérateur de remplacement -replace est un opérateur extrêmement puissant. Il aurait probablement mérité de s’appeler -searchAndReplace tellement il est efficace, mais probablement que son nom aurait été jugé trop long.
Dans sa forme la plus simple -replace peut s’appliquer sur une chaîne simple (scalaire), comme dans l’exemple suivant :
PS > 'PowerShell' -replace 'Shell', 'Guy'
PowerGuy
Shell représente la chaîne à rechercher, et Guy la chaîne de remplacement.
Bien que cela fonctionne parfaitement, ce cas d’usage n’offre pas plus de fonctionnalité que la méthode Replace() appliquée à une chaîne, tel que ci-dessous :
PS > $MaChaine = 'PowerShell'
PS > $MaChaine.Replace('Shell','Guy')
PowerGuy
Le gros intérêt de cet opérateur c’est qu’il peut s’appliquer à un tableau afin de chercher et remplacer une valeur par une autre. Mieux encore, -replace accepte en entrée une expression régulière, ce qui permet des recherches complexes et bien plus encore…
1. Remplacements à l’aide d’une expression régulière
Même si on utilise une chaîne de caractères simple pour effectuer...
Opérateurs de type
Jusqu’à présent, nous vous avons montré comment typer votre valeur et même comment récupérer le type avec la méthode GetType. Mais ce que nous allons désormais découvrir est comment tester le type d’une variable.
Ces opérateurs sont relativement peu utilisés dans la mesure où lorsque nous définissons des paramètres (dans les scripts ou les fonctions), nous leur donnons un type. Il n’est donc pas vraiment utile de tester leur type… Ceci étant, comme ces opérateurs existent, il nous semblait utile de vous en parler.
Opérateur |
Signification |
-is |
Test si l’objet est du même type. |
-isNot |
Test si l’objet n’est pas du même type. |
Pour illustrer l’utilisation de ces opérateurs, voici quelques exemples d’applications :
PS > 'Bonjour' -is [string]
True
PS > 20 -is [int]
True
PS > 'B' -is [int]
False
Opérateurs logiques
Les opérateurs logiques permettent de vérifier jusqu’à plusieurs comparaisons dans une même expression. Par exemple : ($var1 -eq $var2) -and ($var3 -eq $var4) renverra le booléen true si $var1 est égal à $var2 et que $var3 est égal à $var4, dans le cas contraire la valeur false sera renvoyée. Voici la liste des opérateurs logiques disponibles :
Opérateur |
Signification |
-and |
ET logique |
-or |
OU logique |
-not |
NON logique |
! |
NON logique |
-xor |
OU exclusif |
Pour mieux comprendre l’utilisation de ces opérateurs, voici quelques exemples d’applications :
PS > (5 -eq 5) -and (8 -eq 9)
False
Faux, car 5 est bien égal à 5, mais 8 n’est pas égal à 9.
PS > (5 -eq 5) -or (8 -eq 9)
True
Vrai, car l’une des deux expressions est vraie, 5 est bien égal à 5.
PS > -not (8 -eq 9)
True
PS > !(8 -eq 9)
True
Vrai, car 8 n’est pas égal à 9.
Opérateurs binaires
Les opérateurs binaires sont utilisés pour effectuer des opérations entre nombres binaires. Pour rappel, le système binaire est un système en base 2, contrairement au système décimal qui lui est en base 10. C’est-à-dire que la notation ne comporte que des 0 et des 1.
Exemple de conversion de nombres décimaux en base binaire
Décimal Binaire
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
Lorsque nous faisons appel à l’un des opérateurs binaires suivants, les bits des valeurs sont comparés les uns après les autres, puis selon que nous appliquons un ET ou un OU nous obtenons un résultat différent.
Opérateur |
Signification |
-band |
Opérateur ET |
-bor |
Opérateur OU |
-bnot |
Opérateur NON |
-bxor |
Opérateur OU exclusif |
-shr |
Décalage des bits vers la droite |
-shl |
Décalage des bits vers la gauche |
Le résultat retourné après une comparaison binaire est automatiquement converti en système décimal et non pas en système binaire.
Imaginons que pour une application quelconque nous souhaitions savoir si le bit de poids faible d’une variable est égal à...
Opérateurs d’affectation
Vous savez donc maintenant comment affecter une valeur à une variable et réaliser une opération sur cette dernière. Maintenant nous allons vous montrer comment faire les deux en même temps en une seule opération.
Les opérations qui sont décrites dans ce tableau donnent strictement le même résultat.
Notation classique |
Notation raccourcie |
$i=$i+8 |
$i+=8 |
$i=$i-8 |
$i-=8 |
$i=$i*8 |
$i*=8 |
$i=$i/8 |
$i/=8 |
$i=$i%8 |
$i%=8 |
$i=$i+1 |
$i++ |
$i=$i-1 |
$i-- |
La notation $i++ ou $i-- est très utilisée dans les conditions de boucle de façon à incrémenter $i de 1 à chaque passage.
Ainsi, par exemple, voici comment ajouter une valeur avec l’opérateur d’affectation +=.
PS > $i = 0
PS > $i += 15
PS > $i
15
Si on affiche la valeur de la variable $i, on obtient bien 15, car cette instruction est équivalente à : $i = $i + 15.
Poursuivons avec cette fois le calcul des factoriels des chiffres allant de 1 à 10.
Pour cela, nous créons une boucle et, pour chaque valeur de $i, nous la multiplions par la valeur de $var avant de la lui réaffecter :
PS > $var = 1
PS > foreach($i in 1..10){$var *= $i ; $var}
1
2
6
24
120
720
5040
40320
362880
3628800
Comme nous n’avons pas encore abordé...
Opérateurs de redirection
Il faut savoir que les interpréteurs de commandes traitent les informations selon une entrée, une sortie et une erreur standard, chaque élément étant identifié par un descripteur de fichier.
Descripteur |
Identification |
Explication |
0 |
Standard Input |
Flux d’entrée par lequel les données sont entrées dans le shell. Par défaut, le clavier est utilisé comme entrée standard. |
1 |
Standard Output |
Flux de sortie par défaut par lesquelles les données sont émises. Le flux standard est utilisé par la plupart des commandes qui affichent un résultat à l’écran. |
2 |
Error |
Flux de sortie permettant au shell d’émettre les messages d’erreur. La visibilité de ces derniers est gérée via la variable $ErrorActionPreference. |
3 |
Warning |
Flux de sortie permettant au shell d’émettre les messages d’avertissement. Ces derniers ne sont visibles que si la variable $WarningPreference est positionnée à la valeur Continue. |
4 |
Verbose |
Flux de sortie des messages verbeux. Ces messages sont visibles lorsque le mode verbose est activé via la variable $VerbosePreference. |
5 |
Debug |
Flux de sortie des messages de débogage. Ces messages sont visibles lorsque le mode debug est activé via la variable $DebugPreference. |
6 |
Information |
Flux de sortie des messages d’information. Ces derniers ne sont visibles que si la variable $InformationPreference est positionnée à la valeur Continue. |
* |
Tous les flux |
Le caractère étoile représente tous les flux. |
Les flux *, 3, 4 et 5 et leurs variables de préférence associées ont été introduits dans la version 3 de PowerShell.
Le flux 6 (information) a été introduit dans la version 5.
Par défaut, c’est la console qui est la sortie standard de tous les flux énumérés précédemment. Mais de façon à pouvoir les rediriger avec souplesse, PowerShell dispose d’une batterie d’opérateurs. Ces derniers sont identiques à ceux utilisés dans le shell Unix :
Opérateur |
Signification |
x> y |
Redirige le flux x vers le fichier y. Si le fichier y existe déjà... |
Opérateurs de fractionnement et de concaténation
Les opérateurs de fractionnement et de concaténation permettent de combiner ou bien de fractionner à volonté des chaînes de caractères.
Opérateur |
Signification |
-split |
Fractionne une chaîne en sous-chaînes. |
-join |
Concatène plusieurs chaînes en une seule. |
Ainsi, par exemple, voici comment fractionner une chaîne en plaçant l’opérateur -split en début de ligne.
PS > -split 'PowerShell c'est facile'
PowerShell
c'est
facile
Par défaut, le fractionnement est réalisé avec le délimiteur espace « ». Pour changer de délimiteur, il convient de placer l’opérateur en fin de ligne et de le faire suivre du caractère souhaité.
Exemple
PS > 'Nom:Prénom:Adresse:Date' -split ':'
Nom
Prénom
Adresse
Date
Le délimiteur peut être : un caractère unique, une chaîne de caractères, une expression régulière ou un bloc de script (scriptblock).
Pour plus de détails, il existe la rubrique d’aide about_Split qui est très complète.
L’opérateur -join permet de réaliser la concaténation de différentes chaînes de caractères d’un même...
Opérateur de format -f
1. Notions de base
L’opérateur de format -f permet de formater des chaînes de caractères façon .NET, c’est-à-dire exactement de la même manière que nous pourrions le faire en VB.NET ou C#.
Le principe de base est très simple ; en effet, il va s’agir de réserver un ou plusieurs emplacements prédéfinis dans une chaîne de caractères et de substituer ces derniers par une valeur (ou expression). Il suffit alors de placer un ou plusieurs nombres entre accolades (commençant par zéro) dans une chaîne, et automatiquement ces derniers seront substitués par une valeur au moment de l’exécution.
Exemple 1 :
PS > $str = 'powershell'
PS > '{0} est un puissant langage de scripts.' -f $str.ToUpper()
POWERSHELL est un puissant langage de scripts.
Il existe bien entendu d’autres façons de concaténer des chaînes de caractères, néanmoins nous affectionnons particulièrement l’opérateur -f car il apporte une certaine facilité d’écriture et une aisance accrue pour la compréhension du code. Cela est d’autant plus vrai lorsque l’on a de nombreuses données à concaténer, à présenter à l’écran ou à mettre...
Récapitulatif sur les opérateurs
Dans cette liste vous retrouverez tous les opérateurs énoncés au cours de ce chapitre :
Opérateur |
Signification |
-eq |
Égal. |
-lt |
Inférieur à. |
-gt |
Supérieur à. |
-le |
Inférieur ou égal à. |
-ge |
Supérieur ou égal à. |
-ne |
Différent de. |
-not |
Non logique. |
! |
Non logique. |
-match |
Comparaison d’égalité entre une expression et une expression régulière. |
-notMatch |
Comparaison d’inégalité entre une expression et une expression régulière. |
-like |
Comparaison d’égalité d’expression générique. |
-notLike |
Comparaison d’inégalité d’expression générique. |
-replace |
Opérateur de remplacement. |
-and |
ET logique. |
-or |
OU logique. |
-bor |
Opérateur de bits OU. |
-band |
Opérateur de bits ET. |
-bxor |
Opérateur de bits OU exclusif. |
-shr |
Décalage des bits vers la droite. |
-shl |
Décalage des bits vers la gauche. |
-xor |
OU exclusif. |
-is |
Opérateur d’égalité de type. |
-isNot |
Opérateur d’inégalité de type. |
-in |
Teste si une valeur est dans une collection. |
-notIn |
Teste si une valeur n’est pas dans une collection. |
-contains |
Teste si une collection contient une valeur. |
-notContains |
Teste si une collection ne contient pas une valeur. |
-ceq |
Égal (respecte la casse). |
-clt |
Inférieur à (respecte la casse). |
-cgt |
Supérieur à (respecte la casse). |
-cle |
Inférieur ou égal à (respecte la casse). |
-cge |
Supérieur ou égal à (respecte la casse). |
-cne |
Différent de (respecte... |