103 votes

Échapper aux guillemets et aux doubles guillemets

Comment puis-je échapper correctement aux guillemets dans le -param dans la ligne de commande suivante ?

$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd 

Cela échoue bien sûr. J'ai essayé d'échapper aux guillemets (simples et doubles) en utilisant le caractère d'échappement ` et j'ai fait diverses combinaisons, mais rien ne fonctionne.

107voto

Owen B Points 1281

L'utilisation du backtick (`) fonctionne bien pour moi si je les place aux endroits suivants :

$cmd="\\server\toto.exe -batch=B -param=`"sort1;parmtxt='Security ID=1234'`""

$cmd retourne comme :

\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'"

C'est ce que vous cherchiez ?

L'erreur que PowerShell m'a donnée concernait un token 'sort1' inattendu, et c'est ainsi que j'ai déterminé où placer les backticks.

La syntaxe @' ... '@ est appelée "here string" et renvoie exactement ce qui a été saisi. Vous pouvez également les utiliser pour remplir des variables de la manière suivante :

$cmd=@'
"\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
'@

Les symboles d'ouverture et de fermeture doivent être sur leur propre ligne, comme indiqué ci-dessus.

62voto

BartekB Points 4006

Echapper à de tels paramètres est généralement source de frustration et donne l'impression d'une perte de temps. Je vois que vous êtes sur la v2 donc je vous suggère d'utiliser une technique que Joel "Jaykul" Bennet dont le blog a parlé il y a quelque temps .

Pour faire court : il suffit d'entourer votre chaîne de caractères de @' ... '@ :

Start-Process \\server\toto.exe @'
-batch=B -param="sort1;parmtxt='Security ID=1234'"
'@

(Remarquez que je supposé quels guillemets sont nécessaires, et quelles choses vous avez essayé d'échapper). Si vous voulez travailler avec la sortie, vous pouvez ajouter l'option -NoNewWindow interrupteur.

BTW : cette question était si importante que depuis la v3 vous pouvez utiliser --% pour empêcher l'analyseur PowerShell de faire quoi que ce soit avec vos paramètres :

\\server\toto.exe --% -batch=b -param="sort1;paramtxt='Security ID=1234'"

... devrait y fonctionner correctement (avec la même hypothèse).

9voto

pranspach Points 350

Je me suis retrouvé dans une situation similaire aujourd'hui en essayant d'exécuter une commande via un module Node.js :

J'utilisais le PowerShell et j'essayais de l'exécuter :

command -e 'func($a)'

Mais avec les symboles supplémentaires, PowerShell a mal interprété les arguments. Pour corriger cela, j'ai recollé les guillemets échappés :

command -e `"func($a)`"

3voto

Gschmaaz Points 21

Dans Powershell 5, l'échappement des guillemets doubles peut être effectué par le backtick (`). Mais parfois, vous devez fournir vos guillemets doubles échappés, ce qui peut être fait par backslash + backtick (``). Par exemple, dans cet appel curl :

C:\Windows\System32\curl.exe -s -k -H "Content-Type: application/json" -XPOST localhost:9200/index_name/inded_type -d"{\`"velocity\`":3.14}"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X