2009-08-25 5 views
112

Comment est-ce que j'échappe des esperluettes dans un fichier de commandes (ou à partir de la ligne de commande Windows ) afin d'utiliser la commande start pour ouvrir des pages Web avec des esperluettes dans l'URL?Comment est-ce que j'échappe des esperluettes dans des fichiers séquentiels?

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. En outre, si il y a des caractères codés URL (par exemple l'espace est codé comme % 20) dans l'URL et il est dans un fichier de commandes alors '%' doit être codé comme '%%'. 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 

entraînera

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.

+1

J'ai édité la réponse de belugabob il devrait maintenant fonctionner. C'est juste une anomalie dans 'start' qui provoque la citation de l'argument à l'échec s'il est appliqué sans réfléchir. Et dans l'ensemble, je pense que l'inclusion de l'argument entre guillemets est plus facile et moins sujette aux erreurs que d'échapper à tous les personnages qui ont besoin d'y échapper. – Joey

+0

Qu'en est-il du signe plus '+' que devrais-je mettre en avant pour y échapper? – william

+0

Dans PowerShell 'start 'http://www.google.com/search?lang=fr&options=fr&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8" 'fonctionne parce que [PowerShell supprimera les citations] (https : //superuser.com/a/1208974/241386) –

Répondre

39

D'un cmd:

  • & réchappés comme ceci: ^& (basé sur answer 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 

A partir d'un fichier batch

  • & réchappés comme ceci: ^& (basé sur @Wael Dalloul de answer)
  • % réchappés comme ceci: %% (basé sur la mise à jour des postes d'observation)

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

Il pourrait également inclure un exemple de s'échapper "%" - alors je peux nettoyer ma question. –

+0

@PeterMortensen Certainement - J'ai mis à jour ma réponse. –

+1

De quels caractères devrais-je également m'échapper? J'ai remarqué que je dois fuir "|" par "^ |". – liquide

24

Vous pouvez l'encadrer entre guillemets si vous indiquez un premier argument fictif.

Notez que vous devez fournir un premier argument fictif dans ce cas, car start traitera le premier argument comme un titre pour les nouvelles fenêtres de console, s'il est cité. Donc, ce qui suit devrait travailler (et fait ici):

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

OK, je dois admettre que le titre ne correspond pas complètement à la question à l'intérieur. (Pensez-vous que je devrais rendre le titre plus long?) –

+0

Pas si "Doh", après tout - encadrant 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

+0

[PowerShell supprimera les citations des arguments] (https://superuser.com/a/1208974/241386), cela échouera donc. Vous devez utiliser uniquement 'start 'http://www.google.com/search?client=opera&rls=fr&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8" 'sur PowerShell –

18
explorer "http://www.google.com/search?client=opera&rls=...." 
+2

Wow cela fonctionne aussi. Toutes ces 3 façons fonctionnent! – rogerdpack

131

& est utilisé pour des commandes séparées. Par conséquent, vous pouvez utiliser ^ pour échapper à &.

+3

Qu'en est-il du signe plus '+' que dois-je mettre en avant pour l'échapper? – william

+0

Ceci est la solution la plus générale applicable. Cela fonctionne également si un paramètre d'un programme de ligne de commande contient un ou plusieurs esperluands. J'ai juste rencontré ceci - le paramètre était * CGW5COMM & 10C4 & 8301 *. –

+0

La citation d'une esperluette avec le caret^ne semble pas fonctionner dans toutes les circonstances. Par exemple, tenter d'exécuter msdeploy.exe avec/p: switch pour passer un mot de passe avec une perluète ne semble pas fonctionner avec les permutations que j'ai essayées (guillemets, doubles guillemets, premier argument fictif). –

7

La commande

echo this ^& that 

fonctionne comme prévu, outputing

this & that 

La commande

echo this ^& that > tmp 

fonctionne également, écrit la chaîne dans un fichier "tmp". Cependant, avant qu'un tuyau ne soit interprété de manière complètement différente, il est interprété différemment. Il essaie d'écrire la sortie des deux commandes "echo this" et "that" au pipe. L'écho fonctionnera alors "ça" donnera une erreur. Dire

echo this ^& echo that | clip 

mettra les chaînes "this" et "that" dans le presse-papier.

Sans ^:

echo this & echo that | clip 

le premier écho écrire à la console et que la sortie de la deuxième écho sera canalisée à clip (même pour la redirection « > tmp »). Ainsi, lorsque la sortie est en cours de redirection, le^ne cite pas le & mais le place à la place avant la redirection plutôt qu'après.

Pour tuyau un &, il faut citer deux fois

echo this ^^^& that | clip 

Si vous mettez la chaîne dans une variable

set m=this ^& that 

puis

set m 

volonté sortie

m=this & that 

mais l'évidence

échoue parce que, après remplace Windows, la variable, ce qui

echo this & that 

il parse cela comme une nouvelle commande et tente d'exécuter "que".

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

setlocal enableDelayedExpansion 
echo !m! 

Pour la sortie à un tuyau, nous devons remplacer toutes les & s dans la valeur de la variable avec^&, que nous pouvons faire avec le% VAR: dE = A% syntaxe:

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

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

cmd /v /c echo !m! 

Cela fonctionne même lors de l'écriture à un tuyau

cmd /v /c echo !m! | clip 

simple.

+0

Votre solution pour les tuyaux fonctionne, mais vos conclusions sont plus ou moins fausses. Btw. un simple 'echo this ^^^ & que | clip' fonctionne aussi. Pour comprendre la gestion du tuyau magique, vous pouvez lire [SO: Pourquoi l'expansion différée échoue-t-elle lorsque vous êtes dans un bloc de code?] (Http://stackoverflow.com/q/8192318/463115) – jeb

+0

Merci d'avoir signalé que 'echo% m% 'est inutilisable. – Jarekczek

0

Si vous avez besoin de echo, une chaîne contenant des guillemets ne vous aidera pas, car vous les verrez également sur la sortie. En utilisation comme cas 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 
0

L'ajout de ce pour les futurs utilisateurs -

Si vous avez des espaces au nom du fichier ET vous avez un personnage dont vous avez besoin pour échapper: vous ca n utilisez des guillemets simples et doubles pour éviter les erreurs de syntaxe dans la commande.

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

Le ^ caractère échappe aux citations autrement

modifiées pour inclure la fermeture . à la fin de la commande

Questions connexes