Comme beaucoup d’autres langages, PowerShell a des instructions pour exécuter conditionnellement du code dans vos scripts. L’une de ces déclarations est l’instruction if. Aujourd’hui, nous allons plonger dans l’une des commandes les plus fondamentales de PowerShell.,
- Index
- l’exécution Conditionnelle
- if
- les opérateurs de Comparaison
- -eq pour l’égalité
- -ne pas égale à
- -gt -ge -lt -le pour de plus ou moins
- -comme générique correspond à
- -correspondance d’expression régulière
- est de type
- -eq pour l’égalité
- Collection les opérateurs
- -contient
- en
- les opérateurs Logiques
- -non
- !,pressions
- Contrôle de $null
- affectation de Variable
- Suppléant chemin d’exécution
- else
- si Imbriquées
- elseif
- switch
- Pipeline
- Array inline
- Simplifier les opérations complexes
- la continuation de Ligne
- Pré-calcul des résultats
- Plusieurs instructions if
- Utilisation de fonctions
- gestion des Erreurs
- un dernier mot
l’exécution Conditionnelle
Vos scripts, vous serez souvent amené à prendre des décisions et d’effectuer différentes logique de ces décisions., C’est ce que je veux dire par exécution conditionnelle. Vous avez une instruction ou une valeur à évaluer, puis exécutez différentes sections de code en fonction de cette évaluation. C’est exactement ce que fait l’instruction
if
.if
Voici un exemple de base de la balise
if
instruction:$condition = $true if ( $condition ) { Write-Output "The condition was true" }
La première chose que le
if
déclaration n’est d’évaluer l’expression entre parenthèses., S’il est évalué à$true
, alors il exécutera lescriptblock
dans les accolades. Si la valeur était$false
, alors il ignorerait ce scriptblock.dans l’exemple précédent, l’instruction
if
évaluait simplement la variable$condition
. C’était$true
et aurait exécuté la commandeWrite-Output
dans le scriptblock.dans certaines langues, vous pouvez placer une seule ligne de code après l’instruction
if
et elle sera exécutée., Ce n’est pas le cas dans PowerShell. Vous devez fournir unescriptblock
avec des accolades pour qu’il fonctionne correctement.opérateurs de comparaison
la chose la plus courante pour laquelle vous utiliserez l’instruction
if
est de comparer deux éléments entre eux. Powershell a des opérateurs spéciaux pour différents scénarios de comparaison. Lorsque vous utilisez un opérateur de comparaison, la valeur de gauche est comparée à la valeur de droite.,-eq pour l’égalité
Le
-eq
fait un contrôle d’égalité entre deux valeurs pour s’assurer qu’ils sont égaux les uns aux autres.$value = Get-MysteryValue if ( 5 -eq $value ) { # do something }
Dans cet exemple, je prends une valeur connue de
5
et en la comparant à mon$value
pour voir si elles correspondent.Un possible cas d’utilisation est de vérifier l’état d’une valeur avant de prendre une action sur elle. Vous pouvez obtenir un service et vérifier que l’État était en cours d’exécution avant d’appeler
Restart-Service
dessus.,il est courant dans d’autres langages comme C# d’utiliser
==
pour l’égalité (ex:5 == $value
) mais cela ne fonctionne pas avec powershell. Une autre erreur courante que les gens font est d’utiliser le signe égal (ex:5 = $value
) qui est réservé pour l’attribution de valeurs à des variables. En plaçant votre valeur connue sur la gauche, cela rend cette erreur plus gênante à faire.cet opérateur (et d’autres) ont quelques variantes.,
-
-eq
casse de l’égalité -
-ieq
casse de l’égalité -
-ceq
casse de l’égalité
-ne pas égal
De nombreux opérateurs ont une opérateur de vérifier le résultat inverse.
-ne
vérifiera que les valeurs ne sont pas égales entre elles.if ( 5 -ne $value ) { # do something }
l’Utiliser pour s’assurer que l’action s’exécute uniquement si la valeur n’est pas
5
., Un bon cas d’utilisation serait de vérifier si un service était en cours d’exécution avant d’essayer de le démarrer.les Variations:
-
-ne
casse pas égale à -
-ine
casse pas égale à -
-cne
casse pas égale à
ce sont juste à l’inverse des variations de
-eq
. Je regrouperai ces types lorsque j’énumérerai des variations pour d’autres opérateurs.,-gt-ge-lt-le pour une valeur supérieure ou inférieure à
Ces opérateurs sont utilisés pour vérifier si une valeur est supérieure ou inférieure à une autre valeur. Le
-gt -ge -lt -le
signifie GreaterThan, GreaterThanOrEqual, LessThan et LessThanOrEqual.,mangeur égale ou supérieure, insensible à la casse - !,pressions
-
-cge
supérieur ou égal, sensible à la casse -
-lt
moins -
-ilt
moins de, insensible à la casse -
-clt
moins de, sensible à la casse -
-le
inférieur ou égal -
-ile
inférieur ou égal à, insensible à la casse -
-cle
inférieur ou égal à, sensible à la casse
je ne sais pas pourquoi vous devez utiliser la casse et de l’indifférence des options pour ces opérateurs.,
-comme les correspondances de caractères génériques
PowerShell a sa propre syntaxe de correspondance de motifs basée sur des caractères génériques et vous pouvez l’utiliser avec l’opérateur
-like
. Ces modèles génériques sont assez basiques.-
?
correspond à tout caractère unique -
*
correspondra à un nombre quelconque de caractères
$value = 'S-ATX-SQL01' if ( $value -like 'S-*-SQL??') { # do something }
Il est important de souligner que le modèle correspond à l’ensemble de la chaîne., Si vous devez faire correspondre quelque chose au milieu de la chaîne, vous devrez placer le
*
aux deux extrémités de la chaîne.,iv> - -non
les Variations:
-
-like
casse générique -
-ilike
casse générique -
-clike
casse -
-notlike
casse génériques pas de correspondance -
-inotlike
casse génériques pas de correspondance -
-cnotlike
casse pas de correspondance
-correspondance d’expression régulière
Le -match
opérateur permet de vérifier une chaîne pour une expression régulière en fonction de correspondance., Utilisez-le lorsque les motifs génériques ne sont pas assez flexibles pour vous.
$value = 'S-ATX-SQL01' if ( $value -match 'S-\w\w\w-SQL\d\d') { # do something }
Une expression régulière pattern match de n’importe où dans la chaîne de caractères par défaut. Vous pouvez donc spécifier une sous-chaîne que vous souhaitez apparier comme ceci:
$value = 'S-ATX-SQL01' if ( $value -match 'SQL') { # do something }
Regex est un langage complexe qui lui est propre et qui mérite d’être examiné. Je parle plus de -match
et des nombreuses façons d’utiliser regex dans un autre article.,
Variations:
-
-match
case insensitive regex -
-imatch
case insensitive regex -
-cmatch
case sensitive regex -
-notmatch
case insensitive regex not matched -
-inotmatch
case insensitive regex not matched -
-cnotmatch
case sensitive regex not matched
-is of type
You are able to check a value’s type with the -is
operator.,
if ( $value -is ) { # do something }
Vous pouvez utiliser cette option si vous travaillez avec des classes ou d’accepter des objets divers sur le gazoduc. Vous pouvez avoir un service ou un nom de service comme entrée. Vérifiez ensuite si vous avez un service et récupérez le service si vous n’avez que le nom.,
if ( $Service -isnot ) { $Service = Get-Service -Name $Service }
les Variations:
-
-is
type -
-isnot
de type
Collection les opérateurs
Lorsque vous utilisez les opérateurs précédents, avec une seule valeur, le résultat est: $true
ou $false
. Ceci est géré légèrement différemment lorsque vous travaillez avec une collection. Chaque élément de la collection est évalué et l’opérateur retournera à la place chaque valeur évaluée à $true
.,
PS> 1,2,3,4 -eq 3 3
Cela fonctionne encore correctement dans un if
déclaration. Donc, une valeur est renvoyée par votre opérateur, alors l’instruction entière est $true
.
$array = 1..6 if ( $array -gt 3 ) { # do something }
Il y a un petit piège se cachant dans les détails ici que je dois le souligner. Lorsque vous utilisez l’opérateur -ne
de cette façon, il est facile de regarder à tort la logique à l’envers., L’utilisation de -ne
avec une collection renverra $true
si un élément de la collection ne correspond pas à votre valeur.
PS> 1,2,3 -ne 4 1 2 3
Cela peut ressembler à une astuce, mais nous avons opérateurs -contains
et -in
qui gèrent plus efficacement et -notcontains
va faire correctement ce que vous attendez.
-contient
Le -contains
opérateur de vérifier le prélèvement de votre valeur., Dès qu’il trouve une correspondance, il renvoie $true
.
$array = 1..6 if ( $array -contains 3 ) { # do something }
C’est la meilleure façon de voir si la collection contient votre valeur. L’utilisation de Where-Object
( ou -eq
) parcourra la liste entière à chaque fois et sera considérablement plus lente.,
les Variations:
-
-contains
casse match -
-icontains
casse match -
-ccontains
casse match -
-notcontains
casse pas de correspondance -
-inotcontains
casse pas de correspondance -
-cnotcontains
casse pas de correspondance
en
Le -in
opérateur est comme la balise -contains
opérateur à l’exception de la collection est sur le côté droit.,
$array = 1..6 if ( 3 -in $array ) { # do something }
Variations:
-
-in
case insensitive match -
-iin
case insensitive match -
-cin
case sensitive match -
-notin
case insensitive not matched -
-inotin
case insensitive not matched -
-cnotin
case sensitive not matched
Logical operators
Logical operators are used to invert or combine other expressions.,
-non
Le -not
opérateur retourne une expression de $false
de $true
ou de $true
de $false
. Voici un exemple où nous voulons effectuer une action lorsque Test-Path
est $false
.
if ( -not ( Test-Path -Path $path ) )
la Plupart des opérateurs, nous avons parlé de faire avoir une variation où vous n’auriez pas besoin d’utiliser la balise -not
opérateur, mais il ya encore des moments que vous pouvez l’utiliser.
!,
Vous pouvez utiliser !
comme un alias pour -not
.
if ( -not $value ){} if ( !$value ){}
Vous allez voir !
utilisé plus par des gens qui viennent d’un autre langages tels que le C#. Je préfère le taper parce que j’ai du mal à voir en regardant rapidement mes scripts.
et
Vous pouvez combiner les expressions avec le -and
opérateur. Lorsque vous faites cela, les deux parties doivent être $true
pour l’ensemble de l’expression $true
.,
if ( ($age -gt 13) -and ($age -lt 55) )
Dans cet exemple, la balise $age
doit être de 13 ans ou plus pour le côté gauche et à moins de 55 pour le côté droit. J’ai ajouté des parenthèses supplémentaires pour le rendre plus clair dans cet exemple, mais elles sont facultatives tant que l’expression est simple. Voici le même exemple sans eux.
if ( $age -gt 13 -and $age -lt 55 )
Évaluation s’effectue de gauche à droite. Si le premier élément est évalué à $false
, il se quittera plus tôt et n’effectuera pas la bonne comparaison., C’est pratique lorsque vous devez vous assurer qu’une valeur existe avant de l’utiliser. Test-Path
par exemple, provoquera une erreur si vous lui donnez un $null
chemin d’accès.
if ( $null -ne $path -and (Test-Path -Path $path) )
ou
Le -or
permet de spécifier deux expressions et retourne $true
si l’un d’eux est $true
.
if ( $age -le 13 -or $age -ge 55 )
tout comme avec la balise -and
opérateur, l’évaluation s’effectue de gauche à droite., Sauf que, si la première partie est $true
, alors l’ensemble de l’énoncé est: $true
et il ne traitera pas le reste de l’expression.
notez également comment la syntaxe fonctionne pour ces opérateurs. Vous avez besoin de deux expressions distinctes. J’ai vu des utilisateurs essayer de faire quelque chose comme ceci $value -eq 5 -or 6
sans se rendre compte de leur erreur.
-ou exclusif xor
celui-ci est un peu inhabituel. -xor
ne permet qu’une expression à évaluer de $true
., Donc, si les deux éléments sont $false
ou les deux éléments sont $true
, l’expression complète est: $false
. Une autre façon de voir cela est l’expression n’est $true
lorsque les résultats de l’expression sont différents.
Il est rare que quelqu’un utilise cet opérateur logique et je ne peux pas trouver un bon exemple pour expliquer pourquoi je l’utiliserais.
opérateurs bit à bit
Les opérateurs bit à bit effectuent des calculs sur les bits dans les valeurs et produisent une nouvelle valeur comme résultat., L’enseignement des opérateurs bit à bit dépasse le cadre de cet article, mais voici la liste les.
-
-band
binaire ET -
-bor
binaire OU -
-bxor
OU exclusif binaire -
-bnot
binaire NON -
-shl
maj gauche -
-shr
décalage à droite
PowerShell expressions
Nous pouvons normal d’utilisation de PowerShell à l’intérieur de l’état.,
if ( Test-Path -Path $Path )
Test-Path
renvoie $true
ou $false
lorsqu’il exécute. Cela s’applique également aux commandes qui renvoient d’autres valeurs.
if ( Get-Process Notepad* )
Elle permettra d’évaluer de $true
si il est retourné processus et $false
si il n’y a rien., Il est parfaitement valide d’utiliser des expressions de pipeline ou d’autres instructions PowerShell comme celle-ci:
if ( Get-Process | Where Name -eq Notepad )
ces expressions peuvent être combinées entre elles avec les opérateurs -and
Et -or
, mais vous utiliser des parenthèses pour les diviser en sous-expressions.
if ( (Get-Process) -and (Get-Service) )
la Vérification de $null
Ayant un pas de résultat ou un $null
valeur prend la valeur $false
dans le if
déclaration., Lors de la vérification spécifiquement pour les $null
, il est recommandé de placer la balise $null
sur le côté gauche.
if ( $null -eq $value )
Il y a assez peu de nuances lorsque l’on traite avec des $null
valeurs dans PowerShell. Si vous êtes intéressé à plonger plus profondément, j’ai un article sur tout ce que vous vouliez savoir sur null null.
affectation de Variable
j’ai presque oublié d’ajouter celui-ci jusqu’à ce que Prasoon Karunan V me le rappelle.,
Normalement, lorsque vous affectez une valeur à une variable, la valeur n’est pas passée sur le pipeline ou d’une console. Lorsque vous effectuez une affectation de variable dans une sous-expression, elle est transmise au pipeline.
PS> $first = 1 PS> ($second = 2) 2
Voir la façon dont le $first
cession a pas de sortie et le $second
cession n’? Lorsqu’une affectation est effectuée dans une instructionif
, elle s’exécute comme l’affectation$second
ci-dessus., Voici un exemple propre sur comment vous pourriez l’utiliser:
if ( $process = Get-Process Notepad* ) { $process | Stop-Process }
Si $process
est affectée d’une valeur, puis la déclaration sera $true
et le $process
va être arrêté.
assurez-vous de ne pas confondre cela avec-eq
car ce n’est pas une vérification d’égalité. C’est une caractéristique plus obscure que la plupart des gens ne réalisent pas fonctionne de cette façon.,
Suppléant chemin d’exécution
Le if
instruction permet de définir une action pour non seulement lorsque l’instruction est $true
, mais aussi lorsqu’il est $false
. C’est là que l’instruction else
entre en jeu.
else
Le else
instruction est toujours la dernière partie de la if
déclaration lors de son utilisation.
dans cet exemple, nous vérifions le $path
pour nous assurer qu’il s’agit d’un fichier. Si nous trouvons le fichier, nous le déplaçons. Si non, nous allons écrire un avertissement., Ce type de logique de branchement est très commun.
imbriqué si
les instructionsif
Etelse
prennent un bloc de script, nous pouvons donc y placer n’importe quelle commande PowerShell, y compris une autre instructionif
. Cela vous permet d’utiliser une logique beaucoup plus compliquée.
dans cet exemple, nous testons d’abord le chemin heureux, puis nous agissons dessus. Si cela échoue, nous effectuons une autre vérification et fournissons des informations plus détaillées à l’utilisateur.
elseif
Nous ne sommes pas limités à un seul contrôle conditionnel., Nous pouvons enchaîner les instructionsif
etelse
au lieu de les imbriquer en utilisant l’instructionelseif
.
l’exécution se fait de haut en bas. L’instruction top if
est évaluée en premier. Si c’est $false
, puis il se déplace vers le bas à la prochaine elseif
ou else
dans la liste. Ce dernier else
est la valeur par défaut si aucun des autres de retour $true
.,
switch
Au Point tis, je dois mentionner l’instructionswitch
. Il fournit une syntaxe alternative pour effectuer plusieurs comparaisons avec une valeur. Avec switch
, vous spécifiez une expression et ce résultat est comparé à plusieurs valeurs différentes. Si l’une de ces valeurs mach, le bloc de code correspondant est exécuté. Jetez un oeil à cet exemple:
$itemType = 'Role' switch ( $itemType ) { 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' } }
Il y a trois valeurs possibles qui peuvent correspondre à la balise $itemType
., Dans ce cas, il correspondra avec des Role
et le is a role
serait exécuté. J’ai utilisé un exemple très simple juste pour vous donner une certaine exposition à l’opérateur switch
. Je parle plus de tout ce que vous avez toujours voulu savoir sur la déclaration switch dans un autre article.
Pipeline
le pipeline est une caractéristique unique et importante de PowerShell. Toute valeur qui n’est pas supprimée ou affectée à une variable est placée dans le pipeline., Le if
nous fournit un moyen de tirer parti du pipeline d’une manière qui n’est pas toujours évidente.
$discount = if ( $age -ge 55 ) { Get-SeniorDiscount } elseif ( $age -le 13 ) { Get-ChildDiscount } else { 0.00 }
Chaque bloc de script est à placer les résultats des commandes ou de la valeur dans le pipeline. Ensuite, nous affectons le résultat de l’instruction if à la variable $discount
. Cet exemple aurait pu tout aussi facilement affecter ces valeurs à la variable $discount
directement dans chaque scriptblock., Je ne peux pas dire que je l’utilise très souvent avec l’instruction if
, mais j’ai un exemple où je l’ai utilisé récemment.
tableau en ligne
j’ai une fonction appelée Invoke-SnowSql qui lance un exécutable avec plusieurs arguments de ligne de commande. Voici un clip de cette fonction où je construis le tableau d’arguments.
Le $Debug
et $Path
variables sont les paramètres de la fonction sont fournies par l’utilisateur final. Je les évalue en ligne dans l’initialisation de mon tableau., Si $Debug
est vrai, alors ces valeurs tombent dans le $snowSqlParam
au bon endroit. Il en va de même pour la variable $Path
.
simplifiez les opérations complexes
Il est inévitable que vous rencontriez une situation qui a beaucoup trop de comparaisons à vérifier et votre instruction if défile sur le côté droit de l’écran.
ils peuvent être difficiles à lire et vous rendre plus enclin à faire des erreurs. Il ya quelques choses que nous pouvons faire à ce sujet.,
continuation de la ligne
Il y a des opérateurs dans PowerShell qui vous permettent d’envelopper votre commande à la ligne suivante. Les opérateurs logiques -and
et -or
sont de bons opérateurs à utiliser si vous souhaitez rompre votre expression en plusieurs lignes.
il se passe encore beaucoup de choses, mais placer chaque pièce sur sa propre ligne fait une grande différence. Je ne le fais généralement que lorsque j’obtiens plus de deux comparaisons ou si je dois faire défiler vers la droite pour lire l’un des ligiques.,
Pré-calcul des résultats
Nous pouvons prendre cette déclaration de l’instruction si et seulement vérifier le résultat.
cela semble juste beaucoup plus propre que l’exemple précédent. Vous avez également la possibilité d’utiliser un nom de variable qui explique ce que vous vérifiez vraiment. C’est aussi un exemple de code auto-documenté qui enregistre les commentaires inutiles.
plusieurs instructions if
Nous pouvons diviser cela en plusieurs instructions et les vérifier une à la fois. Dans ce cas, nous utiliserons un indicateur ou une variable de suivi pour combiner les résultats.,
j’ai dû inverser la logique pour que la logique de drapeau fonctionne correctement. Chaque évaluation est une instruction individuelle if
. L’avantage de ceci est que lorsque vous déboguez, vous pouvez dire exactement ce que fait la logique. J’ai pu ajouter une beaucoup meilleure verbosité en même temps.
l’inconvénient évident est qu’il est tellement plus de code à écrire. Le code est plus complexe à regarder qu’une seule ligne, de la logique et explose en 25 lignes ou plus.
en utilisant des fonctions
Nous pouvons également déplacer toute cette logique de validation dans une fonction., Regardez à quel point cela semble propre en un coup d’œil.
if ( Test-SecureDriveConfiguration -ADUser $user ) { # do something }
Vous avez encore créer la fonction pour procéder à la validation, mais il fait ce code beaucoup plus facile de travailler avec. Cela rend ce code plus facile à tester. Dans vos tests, vous pouvez simuler l’appel à Test-ADDriveConfiguration
et vous n’avez besoin que de deux tests pour cette fonction. L’une où il renvoie $true
et un autre où il retourne $false
. Tester l’autre fonction sera plus simple car elle est si petite.,
le corps de cette fonction pourrait toujours être celui avec lequel nous avons commencé ou la logique éclatée que nous avons utilisée dans la dernière section. Cela fonctionne bien pour les deux scénarios et vous permet de modifier facilement cette implémentation plus tard.
gestion des erreurs
Une utilisation très importante de l’instructionif
consiste à vérifier les conditions d’erreur avant de rencontrer des erreurs. Un bon exemple est de vérifier si un dossier existe déjà avant d’essayer de le créer.,
if ( -not (Test-Path -Path $folder) ) { New-Item -Type Directory -Path $folder }
je tiens à dire que si vous vous attendez à une exception arriver, ce n’est pas vraiment une exception. Vérifiez donc vos valeurs et validez vos conditions où vous le pouvez.
Si vous voulez plonger un peu plus dans la gestion réelle des exceptions, j’ai un article sur tout ce que vous avez toujours voulu savoir sur les exceptions.
derniers mots
Le if
déclaration est une déclaration simple mais est très fondamentale morceau de PowerShell. Vous vous retrouverez à l’utiliser plusieurs fois dans presque tous les scripts que vous écrivez., J’espère que vous avez une meilleure compréhension que vous aviez avant.