Powershell - simple quote, double quotes et protection

Pour me soutenir, vous pouvez vous abonner à la chaîne, partager et liker les vidéos, désactiver votre bloqueur de pub ou encore faire un don. Merci!

Bonjour,

Un article pour faire le point sur les valeurs chaines en simple quote ’, double quote ” et les protections.

Le code PowerShell de démonstration

# Récupérer le 1er service
$service = Get-Service | select-object -first 1
# ou
$service = (Get-Service)[0]
# Récupérer son nom. J'utilise cette syntaxe volontairement pour la démonstration.
$name = $service.name
# Testons les syntaxes suivantes :
"Le nom du service est $name"
'Le nom du service est $name'
# On remarque que la simple quote n'interprète pas les variables
# Le traitement en simple quote est plus rapide,
# Powershell n'ayant pas à se soucier de l'interprétation de variable.
# La variable $name était-elle indispensable ?
"Le nom du service est $service.name"
'Le nom du service est $service.name'
# La simple quote reste fidèle à elle-même
# Le principe objet.propriété ne fonctionne pas avec les "" quotes,
# dans ce cas il affiche le typename_de_l'objet.name.
# Il est nécessaire d'utiliser la syntaxe $() pour que cela fonctionne (sauf en simple quote).
# $() est une sous-expression, le contenu est évalué et le résultat envoyé :
"Le nom du service est $($service.name)"
'Le nom du service est $($service.name)'
# Personnellement j'utilise plutôt l'opérateur de format -f qui est d'ailleurs préconisé.
'Le nom du service est {0}' -f $service.name

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-5.1

# Pour protéger un caractère, il faut utiliser dans ce contexte `,
# dans d'autres contexte (opérateurs…), c'est \ :
"Le nom du service est `$name"
# Comment faire passer une commande non Powershell avec des caractères
# ayant un sens au yeux de Powershell comme (){} $
# Testons la commande suivante qui définit le délai pendant lequel le menu de choix d'OS
# est disponible lors d'un multiboot (la valeur est déjà de 30 secondes par défaut) :
bcdedit /set {bootmgr} timeout 30
# Pour résoudre le problème
# Soit protéger chaque caractère génant :
bcdedit /set `{bootmgr`} timeout 30
# ou utiliser --% (stop-parsing token) qui indique à Powershell de considérer
# tous les caractères suivant comme de simples caractères :
bcdedit --% /set {bootmgr} timeout 30
# Mais il peut y avoir un problème, par exemple :
$time = 30
bcdedit --% /set {bootmgr} timeout $time
# La variable n'est plus interprêtée, préférez les protections dans ce contexte :
bcdedit /set `{bootmgr`} timeout $time
# Pourquoi ces deux syntaxes fonctionnent ?
Get-service spooler
Get-service 'spooler'

Réponse : À cause du parser ! Le parser est responsable de présenter les informations envoyées par la console ou par le script de manière exécutable pour Powershell. Il y a deux modes, ce qui explique pourquoi une chaine dans un argument ne nécessite pas de quote (sauf s’il y a un espace) contrairement à une chaine dans une variable : - Mode argument - Mode expression

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_parsing?view=powershell-5.1

Video : Powershell - simple quote, double quotes et protection

Liens en relation