Introduction au PowerShell
La grammaire du langage de scripting
La grammaire du langage de scripting de Powershell est très complète, dans cette page nous ne verrons que les bases les plus utiles pour réaliser des premiers scripts.
Manipuler des variables
Les variables sont précédés d'un $ : $var
Pour assigner une valeur il existe plusieurs opérateurs qui sont les mêmes que dans beaucoup de langage :
=, +=, -=, *=, /=, %=
De même, pour effectuer des comparaisons c'est assez simple :
-eq, -ne, -ge, -gt, -lt, -le
-ieq, -ine, -ige, -igt, -ilt, -ile
-ceq, -cne, -cge, -cgt, -clt, -cle
< et > sont réservés pour les redirections
Pour aller plus loin on peux effectuer des comparaisons plus évoluées avec :
-like, -ilike, -clike
-match, -imatch, -cmatch
-replace, -ireplace, -creplace
Les types
La déclaration de type n'est pas obligatoire en Powershell mais elle permet de rendre plus lisible les scripts que l'on écrit.
On peut aussi caster certains objets afin d'avoir de nouvelles propriétés sur les objets (Voir article sur le Xml par exemple).
Tout les objets Powershell possède la méthode GetType()
qui permet de connaître le type courant d'un objet :
PS> $var="Coucou" PS> $var Coucou PS> $var.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object PS> $var.GetType().FullName System.String
Exemples de déclarations ou de conversions de type :
[uint32]$num = "112" [Array]$tab = 1..2 [string]$str = $num
Les opérateurs pour les types sont : […], -as, -is, -isnot. […]
permet de typer une variable, -as
permet de caster un objet et -is
permet de vérifier le type de l'objet.
PS> 1 -is "int“ True PS> "11/1/2006" -as "datetime" Wednesday, November 01, 2006 12:00:00 AM
Les structures conditionnelles et les boucles
Comme pour tout langage de script il existe les instructions de boucle et de test :
Les tests sont effectués avec les instructions if else elseif
:
if ($x –gt 20) { ..... } elseif ($x –gt 50) { ..... } else { ..... }
Pour effectuer des actions différentes en fonction des valeurs prises par une variable on utilise le switch
.
A noter que dans la version de Powershell, les valeurs peuvent être des constantes, des expressions régulières ou des
expressions avec wildcard (*). L'instruction break
permet de sortir du test et de ne pas réaliser les
instructions qui suivent.
Switch [ -regex | -wildcard | -exact ][-casesensitive] [-file [filename|$variable] | ( Pipeline ) ] switch -wildcard ( $tab ) { "a*" { "a* $_"; break;} "b*" { " b* $_“; } default { “Nothing..." } }
Pour finir il existe plusieurs manières de réaliser des boucles avec les instructions For, Foreach, While ...
:
For ($i = 0; $i < 32; $i++) {$i} Foreach ( $file in get-childitem ) { $file.Name } While ($i –lt 10 ) { $i++ }
Les filtres et les fonctions
Ils existent deux types de fonctions, les filtres (filter
) et les fonctions (function
).
La différence entre les filtres et les fonctions est la façon dont elle se comporte avec le pipeline.
Un filtre traite les objets reçus du pipeline un par un alors qu’une fonction exécute par défaut
son traitement pour l’ensemble des données reçues dans le pipe. Dans ce cas on attend la fin du
traitement contenu dans cette fonction pour passer à l’étape suivante du pipeline.
Le nombre de bloc de code à déclarer est donc différent, pour un filtre il n'y a qu'un bloc. Mais pour les fonctions
il y en a 3 sous-blocs (Begin
, Process
, End
).
Pour déclarer les paramètres il est possible de préciser le type et la valeur par défaut
dans le cas où le paramètre n'est appelé.
Les filtres :
Filter showme( [string]$name="default", [int32]$age=0 ) { "name= " + $name; "Age = " + "$age" }
Les fonctions :
function Get-Total ($property, $formatString) { Begin{ $total = 0 } Process{ $total += $_.$property } End{ $formatString -f $total,$property } }
Dans ce cas, la fonction n'est appelée qu'une seule fois :
function MyEcho { for ($i = 0; $i –lt $args.count; $i++) { "arg{0} = {1}" –f $i, $args[$i] } }
Pour appeler une fonction il ne faut pas utiliser de parenthèse pour lui passer les paramètres, il suffit de les espacés sans virgule.
showme robert 20 showme robert,20 showme(robert,20)