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
# 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 = 30bcdedit --% /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 spoolerGet-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
Video : Powershell - simple quote, double quotes et protection
Liens en relation
-
Powershell - Tester la connectivité réseau et l'accessibilité aux ports
Tester la connectivité réseau et l'accessibilité aux ports avec Powershell -
Powershell - Afficher les connections réseau (équivalent de netstat)
Afficher les connections réseau (ports en écoute, connections actives...) -
Powershell - Tester la résolution de nom (équivalent de nslookup)
Commandes Powershell permettant de tester la résolution de nom (équivalent de nslookup) -
Powershell - Afficher et gérer la configuration DNS des interfaces réseau
Commandes Powershell permettant d'afficher et de gérer la configuration DNS des interfaces réseau -
Powershell - Gérer la configuration IP des interfaces réseau
Commandes Powershell permettant d'afficher et de modifier la configuration IP des interfaces réseau -
Powershell - Gérer l'état et la configuration des interfaces réseau
Commandes Powershell permettant d'afficher et de modifier l'état et la configuration des interfaces réseau (désactiver l'IPv6, activer/désactiver une interface)
Suivez-moi sur
Soutenez-moi
Contenu récent
Powershell - Tester la connectivité réseau et l'accessibilité aux ports
Powershell - Afficher les connections réseau (équivalent de netstat)
Powershell - Tester la résolution de nom (équivalent de nslookup)
Powershell - Afficher et gérer la configuration DNS des interfaces réseau
Powershell - Gérer la configuration IP des interfaces réseau
Powershell - Gérer l'état et la configuration des interfaces réseau
Powershell et le left hand side
Powershell - Gérer les disques, les partitions et les volumes
Powershell - Gérer les points de restauration système sous Windows