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)