181 votes

Comment échapper aux esperluettes dans les fichiers batch ?

Comment puis-je échapper aux esperluettes dans un fichier batch (ou à partir de la ligne de commande de Windows) afin d'utiliser la fonction d'échappement de l'ordinateur ? ligne de commande Windows) afin d'utiliser la fonction start pour pour ouvrir les pages web dont l'URL contient des esperluettes ?

Les guillemets ne fonctionnent pas avec start ; cela démarre une nouvelle fenêtre de ligne de commande à la place.

Mise à jour 1 : La solution de Wael Dalloul fonctionne. En outre, si il y a des caractères codés dans l'URL (par exemple, l'espace est codé en tant que %20) dans l'URL et il est dans un fichier batch alors '%' doit être être codé en tant que "%%". Ce n'est pas le cas dans l'exemple.

Exemple, à partir de la ligne de commande ( CMD.EXE ) :

start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8

aura pour résultat

http://www.google.com/search?client=opera 

ouvert dans le navigateur par défaut et ces erreurs dans la fenêtre de la ligne de commande :

'rls' is not recognized as an internal or external command,
operable program or batch file.
'q' is not recognized as an internal or external command,
operable program or batch file.
'sourceid' is not recognized as an internal or external command,
operable program or batch file.
'ie' is not recognized as an internal or external command,
operable program or batch file.
'oe' is not recognized as an internal or external command,
operable program or batch file.

Plate-forme : Windows XP 64 bit SP2.

1 votes

J'ai modifié la réponse de belugabob pour qu'elle fonctionne maintenant. C'est juste une bizarrerie dans start qui fait que la citation de l'argument échoue si elle est appliquée sans réflexion. Et dans l'ensemble, je pense qu'il est plus facile et moins risqué de mettre l'argument entre guillemets que d'échapper chaque caractère qui doit l'être.

1 votes

Et le signe plus ? + que dois-je mettre devant pour l'échapper ?

0 votes

Dans PowerShell start "http://www.google.com/search?client=opera&rls=en&q=escape+a‌​mpersand&sourceid=op‌​era&ie=utf-8&oe=utf-‌​8" fonctionne car PowerShell supprimera les guillemets

167voto

Wael Dalloul Points 7995

& est utilisé pour séparer les commandes. Vous pouvez donc utiliser ^ pour échapper à la & .

4 votes

Et le signe plus ? + que dois-je mettre devant pour l'échapper ?

0 votes

Il s'agit de la solution la plus généralement applicable. Elle fonctionne également si un paramètre d'un programme en ligne de commande contient une ou plusieurs esperluettes. Je viens de rencontrer cela - le paramètre était CGW5COMM&10C4&8301 .

0 votes

Le fait de citer une esperluette avec le caractère d'accentuation ^ ne semble pas fonctionner dans toutes les circonstances. Par exemple, essayer d'exécuter msdeploy.exe avec le commutateur /p : pour passer un mot de passe avec une esperluette ne semble pas fonctionner avec toutes les permutations que j'ai essayées (guillemets, guillemets doubles, premier argument fictif).

130voto

A partir d'un cmd :

  • & s'échappe comme ceci : ^& (basé sur @Wael Dalloul's réponse )
  • % n'a pas besoin d'être échappé

Un exemple :

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%20and%20percentage+in+cmd^&sourceid=opera^&ie=utf-8^&oe=utf-8

À partir d'un fichier batch

  • & s'échappe comme ceci : ^& (basé sur @Wael Dalloul's réponse )
  • % s'échappe comme ceci : %% (d'après la mise à jour de l'OP)

Un exemple :

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%%20and%%20percentage+in+batch+file^&sourceid=opera^&ie=utf-8^&oe=utf-8

0 votes

Il pourrait également inclure un exemple d'échappement de "%" - je pourrai alors clarifier ma question.

0 votes

@PeterMortensen Tout à fait - j'ai mis à jour ma réponse.

2 votes

Quels sont les personnages que je dois aussi fuir ? J'ai remarqué que je dois échapper "|" par "^|".

34voto

belugabob Points 2966

Vous pouvez le mettre entre guillemets, si vous fournissez un premier argument fictif.

Notez que vous devez fournir un premier argument factice dans ce cas, car start traitera le premier argument comme un titre pour la nouvelle console Windows, s'il est cité. Ainsi, ce qui suit devrait fonctionner (et fonctionne ici) :

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"

0 votes

Bon, j'admets que le titre ne correspond pas tout à fait à la question posée. (Pensez-vous que je devrais rendre le titre plus long ?)

0 votes

Pas si "Doh", après tout - mettre entre guillemets était la bonne idée - je ne savais pas pour le titre de la fenêtre de la console. Merci Johannes !

0 votes

PowerShell enlèvera les guillemets des arguments donc cela va échouer. Vous devez utiliser uniquement start "http://www.google.com/search?client=opera&rls=en&q=escape+a‌​mpersand&sourceid=op‌​era&ie=utf-8&oe=utf-‌​8" sur PowerShell

21voto

AVD Points 57984
explorer "http://www.google.com/search?client=opera&rls=...."

18voto

Denis Howe Points 315

La commande

echo this ^& that

fonctionne comme prévu, en produisant

this & that

La commande

echo this ^& that > tmp

fonctionne également, en écrivant la chaîne dans le fichier "tmp". Cependant, avant qu'un pipe

echo this ^& that | clip

le ^ est interprété de manière complètement différente. Il essaie d'écrire la sortie des deux commandes "echo this" et "that" dans le pipe. L'écho fonctionnera alors que "that" donnera une erreur. En disant

echo this ^& echo that | clip

mettra les chaînes de caractères "ceci" et "cela" sur le presse-papiers.

Sans le ^ :

echo this & echo that | clip

le premier écho écrira dans la console et seule la sortie du second écho sera envoyée vers clip (de même pour la redirection "> tmp"). Ainsi, lorsque la sortie est redirigée, le ^ ne cite pas le & mais fait en sorte qu'il soit appliqué avant la redirection plutôt qu'après.

Pour pipeauter un &, vous devez le citer deux fois

echo this ^^^& that | clip

Si vous mettez la chaîne dans une variable

set m=this ^& that

puis

set m

produira

m=this & that

mais l'évidence

echo %m%

échoue parce que, après que Windows ait substitué la variable, ce qui donne

echo this & that

il analyse cela comme une nouvelle commande et essaie d'exécuter "cela".

Dans un fichier batch, vous pouvez utiliser expansion retardée :

setlocal enableDelayedExpansion
echo !m!

Pour sortir vers un tube, nous devons remplacer tous les & dans la valeur de la variable par ^&, ce que nous pouvons faire avec la syntaxe %VAR:FROM=TO% :

echo !m:^&=^^^&! | clip

Sur la ligne de commande, "cmd /v" active l'expansion retardée :

cmd /v /c echo !m!

Cela fonctionne même en écrivant dans un tube

cmd /v /c echo !m! | clip

Simple.

0 votes

Votre solution pour les tuyaux fonctionne, mais vos conclusions sont plus ou moins fausses. Au fait, un simple echo this ^^^& that | clip fonctionne aussi. Pour comprendre la manipulation des tuyaux magiques, vous pouvez lire SO : Pourquoi l'expansion retardée échoue-t-elle à l'intérieur d'un bloc de code canalisé ?

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