PowerShell : simple quote VS double quote (guillemets)

I. Présentation

Lorsque l'on utilise PowerShell, on peut se retrouver face à une certaine confusion, si l'on ne maîtrise pas bien le fonctionnement des simples quote ( ' ) et des doubles quotes, c'est-à-dire les guillemets ( " ). Microsoft parle de guillemets simples ( ' ) et de guillemets doubles ( " ). Bien que l'écriture soit très proche, on peut avoir tendance à les mélanger, sauf que cela peut avoir un impact sur le fonctionnement de votre bout de code PowerShell.

Dans ce tutoriel, je vous propose différents exemples pour bien comprendre comment fonctionne le simple quote et le double quote.

Si vous êtes prêt pour le match du jour "Simple quote VS double quote", alors, c'est parti !

II. PowerShell : guillemets simples VS guillemets doubles

Pour que ce soit facile à comprendre, nous allons progresser à l'aide d'exemples. Tout d'abord, commençons par ce premier exemple :

PS> Write-Host 'Bonjour'
Bonjour

PS> Write-Host "Bonjour"
Bonjour

Nous constatons que le résultat renvoyé est le même, peu importe si l'on utilise une apostrophe (simple quote) ou des guillemets (double quote).

Prenons un autre exemple, où cette fois-ci on va utiliser une variable ($Prenom) pour créer la phrase à écrire dans la console.

PS> $Prenom = "Florian"

PS> Write-Host 'Bonjour $Prenom'
Bonjour $Prenom

PS> Write-Host "Bonjour $Prenom"
Bonjour Florian
PS>

Tiens, c'est intéressant : lorsque l'on utilise de simples quote ( ' ), la console ne renvoie pas la valeur de la variable, mais le nom de la variable en lui-même. À l'inverse, lorsque l'on utilise les doubles quote ( " ), la console renvoie bien la phrase complète, où la variable est remplacée par sa valeur.

En voilà une sacrée différence ! En effet, lorsque l'on utilise de simples quote, les variables et les commandes éventuelles ne sont pas "exécutées" : elles sont traitées comme du texte ! Cela peut avoir un intérêt dans certains cas, mais généralement on souhaite récupérer la valeur de notre variable, et non son nom.

Lorsque l'on utilise les doubles quote, on est capable d'aller chercher une valeur contenue dans une variable externe à la commande que l'on exécute, ici un simple Write-Host. Plus précisément, les doubles quote vont tenir compte de la présence du caractère "$".

Si je précise une commande, par exemple Get-Date pour récupérer la date en PowerShell, le résultat est le même dans les deux cas :

PS> Write-Host 'Bonjour, nous sommes le Get-Date -Format dd/MM/yyyy'
Bonjour, nous sommes le Get-Date -Format dd/MM/yyyy

PS> Write-Host "Bonjour, nous sommes le Get-Date -Format dd/MM/yyyy"
Bonjour, nous sommes le Get-Date -Format dd/MM/yyyy

Par contre, si j'englobe ma commande Get-Date avec $(), là c'est différent : ma commande sera bien exécutée dans un cas. Ce qui donne :

PS> Write-Host 'Bonjour, nous sommes le $(Get-Date -Format dd/MM/yyyy)'
Bonjour, nous sommes le $(Get-Date -Format dd/MM/yyyy)

PS> Write-Host "Bonjour, nous sommes le $(Get-Date -Format dd/MM/yyyy)"
Bonjour, nous sommes le 16/06/2021
PowerShell : exemple simple quote et double quote
PowerShell : exemples simple quote et double quote

De la même façon, pour faire un simple calcul :

PS> Write-Host "Une année est composée de 6 + 6 mois"
Une année est composée de 6 + 6 mois

PS> Write-Host "Une année est composée de $(6 + 6) mois"
Une année est composée de 12 mois

L'importance d'englober la commande à exécuter dans $() ne fait plus de doute !

Si l'on veut écrire du texte entre guillemets (double quote), tout en appelant une variable, on peut se retrouver dans une situation délicate. On pourrait simplement mixer l'utilisation des deux types de quote, comme ceci :

PS> Write-Host 'Bonjour, voici un "texte" entre guillemets pour $Prenom'
Bonjour, voici un "texte" entre guillemets pour $Prenom

Le problème, c'est que la variable ne sera pas traitée. En fait, pour que cela fonctionne, il faut doubler les guillemets comme ceci, tout en utilisant des guillemets pour la chaîne globale :

PS> Write-Host "Bonjour, voici un ""texte"" entre guillemets pour $Prenom"
Bonjour, voici un "texte" entre guillemets pour Florian

Ce principe fonctionne aussi avec les guillemets simples :

PS> Write-Host 'J''adore PowerShell !'
J'adore PowerShell !

Avec ces différents exemples, vous devez être en mesure de maîtriser cette notion indispensable ! 🙂

Pour finir sur le sujet, je me suis amusé à comparer les performances via Measure-Command lorsque l'on utilise les guillemets simples ou les guillemets doubles. La différence est mineure, mais les guillemets doubles semblent plus rapides malgré tout pour afficher une simple chaîne ! Par contre, si l'on commence à ajouter des commandes à traiter (comme Get-Date), forcément cela aura un impact ! Mais bon, de toute façon, nous n'avons pas le choix lorsque l'on veut inclure ce type de traitement.

Si vous souhaitez vous amuser, voici deux boucles pour écrire la même phrase en boucle, mais de deux façons différentes :

$Var = "Le match !"

$SimpleQuote = Measure-Command {
for ($i = 0; $i -lt 300; $i++) { Write-Host 'Simple quote VS double quote : $Var' }
}

$DoubleQuote = Measure-Command {
for ($i = 0; $i -lt 300; $i++) { Write-Host "Simple quote VS double quote : $Var" }
}

# Afficher les résultats :

$SimpleQuote
$DoubleQuote

Vous êtes désormais en mesure de maîtriser les guillemets simples (simple quote) et les guillemets doubles (double quote) en PowerShell !

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian Burnel

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

florian has 3273 posts and counting.See all posts by florian

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

 

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.