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, acheter mes plans 3D ou encore faire un don ou vous abonnez sur Ko-Fi. 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

Play

Liens en relation