Comment échapper aux esperluettes dans les fichiers de commandes?

146

Comment puis-je échapper aux esperluettes dans un fichier de commandes (ou à partir de la ligne de commande Windows) afin d'utiliser la startcommande pour ouvrir des pages Web avec des esperluettes dans l'URL?

Les guillemets doubles ne fonctionneront 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. De plus, s'il y a des caractères encodés URL (par exemple, l'espace est encodé en% 20) dans l'URL et qu'elle se trouve dans un fichier batch, alors «%» doit être encodé en «%%». 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 

étant ouvert dans le navigateur par défaut et ces erreurs dans la fenêtre de 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 bits SP2.

Peter Mortensen
la source
1
J'ai édité la réponse de belugabob donc ça devrait fonctionner maintenant. C'est juste une bizarrerie dans startlaquelle la citation de l'argument échoue si elle est appliquée sans réfléchir. Et dans l'ensemble, je pense que mettre l'argument entre guillemets est plus facile et moins sujet aux erreurs que d'échapper à chaque caractère qui doit s'échapper.
Joey
Qu'en est-il du signe plus +que dois-je mettre devant pour y échapper?
william
Dans PowerShell start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"fonctionne parce que PowerShell supprimera les citations
phuclv

Réponses:

91

À partir d'un cmd :

  • &est échappé comme ceci: ^&(basé sur la réponse de @Wael Dalloul )
  • % 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

  • &est échappé comme ceci: ^&(basé sur la réponse de @Wael Dalloul )
  • %est échappé comme ceci: %%(basé sur la mise à jour des 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
Lasse Christiansen
la source
Il pourrait également inclure un exemple d'échappatoire de "%" - alors je peux nettoyer ma question.
Peter Mortensen
@PeterMortensen Certainement - j'ai mis à jour ma réponse.
Lasse Christiansen
2
Quels personnages dois-je également échapper? J'ai remarqué que je dois m'échapper "|" par "^ |".
liquide
Dans ce cas %n'a pas besoin d'être échappé, car qui serait assez stupide pour définir 20andcomme une variable d'environnement? Si vous l'avez fait, vous start http://www.google.com/search?q=ampersand%20and%20percentagepourriez créer un lien vers http://www.google.com/search?q=ampersandsomething-silly20percentage. En utilisant ^%pour échapper dans cmd, l'exemple fonctionne comme prévu.
TamaMcGlinn le
145

&est utilisé pour séparer les commandes. Par conséquent, vous pouvez utiliser ^pour échapper au fichier &.

Wael Dalloul
la source
3
Qu'en est-il du signe plus +que dois-je mettre devant pour y échapper?
william
C'est la solution applicable la plus générale. Cela fonctionne également si un paramètre d'un programme de ligne de commande contient une ou plusieurs esperluettes. Je viens de rencontrer ceci - le paramètre était CGW5COMM & 10C4 & 8301 .
Peter Mortensen
Citant une esperluette avec le caractère caret ^ ne semble pas fonctionner dans toutes les circonstances. Par exemple, tenter d'exécuter msdeploy.exe avec le commutateur / p: pour passer un mot de passe avec une esperluette ne semble pas fonctionner avec les permutations que j'ai essayées (guillemets, guillemets doubles, premier argument factice).
Derek Greer
3
Un exemple d'utilisation ^serait inestimable.
jpmc26
2
@ jpmc26 J'ai ajouté un exemple dans cette réponse .
Lasse Christiansen
29

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

Notez que vous devez fournir un premier argument factice dans ce cas, car startle premier argument sera traité comme un titre pour les nouvelles fenêtres de console, s'il est cité. Donc, 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"
bélugabob
la source
OK, j'admets que le titre ne correspond pas complètement à la question à l'intérieur. (Pensez-vous que je devrais prolonger le titre?)
Peter Mortensen
Pas si 'Doh', après tout - mettre entre guillemets était la bonne idée - ne savait tout simplement pas sur le titre de la fenêtre de la console. Merci Johannes!
belugabob
PowerShell supprimera les guillemets des arguments , ce qui échouera. Vous devez utiliser uniquement start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"sur PowerShell
phuclv
20
explorer "http://www.google.com/search?client=opera&rls=...."
adatapost
la source
12

La commande

echo this ^& that

fonctionne comme prévu, sortie

this & that

La commande

echo this ^& that > tmp

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

echo this ^& that | clip

le ^ est interprété complètement différemment. Il essaie d'écrire la sortie des deux commandes "echo this" et "that" dans le tube. L'écho fonctionnera alors "ça" donnera une erreur. En disant

echo this ^& echo that | clip

mettra les chaînes «ceci» et «cela» dans 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 redirigée vers le clip (de même pour la redirection "> tmp"). Ainsi, lorsque la sortie est redirigée, le ^ ne cite pas le & mais le fait appliquer avant la redirection plutôt qu'après.

Pour canaliser 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

sortira

m=this & that

mais l'évidence

echo %m%

échoue car, une fois que Windows remplace la variable, il en résulte

echo this & that

il analyse ceci comme une nouvelle commande et essaie d'exécuter «cela».

Dans un fichier batch, vous pouvez utiliser l' expansion différée :

setlocal enableDelayedExpansion
echo !m!

Pour sortir vers un tube, nous devons remplacer tous les & s 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 différée:

cmd /v /c echo !m!

Cela fonctionne même lorsque vous écrivez dans un tuyau

cmd /v /c echo !m! | clip

Facile.

Denis Howe
la source
Votre solution pour les tuyaux fonctionne, mais vos conclusions sont plus ou moins fausses. Btw. un simple echo this ^^^& that | clipfonctionne aussi. Pour comprendre la gestion du tuyau magique, vous pouvez lire SO: Pourquoi l'expansion retardée échoue-t-elle à l'intérieur d'un bloc de code canalisé?
jeb
1

Si vous avez besoin d' echoune chaîne contenant une esperluette, les guillemets n'aideront pas, car vous les verriez également sur la sortie. Dans un tel cas, utilisez for:

for %a in ("First & Last") do echo %~a

... dans un script batch:

for %%a in ("First & Last") do echo %%~a

ou

for %%a in ("%~1") do echo %%~a
Jaroslav Záruba
la source
0

Si vous avez des espaces dans le nom du fichier et vous avez un caractère dont vous avez besoin pour échapper:

Vous pouvez utiliser des guillemets simples ET doubles pour éviter toute erreur de nom dans la commande.

scp ./'files name with spaces/internal folder with spaces/"text & files stored.txt"' .

Le ^caractère échappe aux citations autrement.

be-ns
la source