web-dev-qa-db-fra.com

Comment échapper aux esperluettes dans les fichiers de commandes?

Comment puis-je échapper 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?

Les guillemets doubles ne fonctionneront pas avec start; Cela ouvre une nouvelle fenêtre de ligne de commande

Update 1 : La solution de Wael Dalloul fonctionne. De plus, si Il existe des caractères encodés en URL (par exemple, l'espace est codé en tant que % 20) dans l'URL et dans un fichier de traitement par lots, alors '%' doit ê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 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.

123
Peter Mortensen

D'un cmd:

  • & est échappé comme ceci: ^& (basé sur le 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 le 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
62
Lasse Christiansen

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

133
Wael Dalloul

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 start traitera le premier argument comme un titre pour les nouvelles fenêtres de la 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"
26
belugabob
Explorer "http://www.google.com/search?client=opera&rls=...."
19
adatapost

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 une pipe

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 "cela" 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 va écrire sur la console et seule la sortie du deuxième écho sera transmise au clip (de la même manière pour la redirection "> tmp"). Ainsi, lorsque la sortie est redirigée, le ^ ne cite pas le & mais le fait plutôt appliquer avant le redirection plutôt qu'après.

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

va sortir

m=this & that

mais l'évident

echo %m%

échoue car, après que Windows ait substitué la variable, il en résulte

echo this & that

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

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

setlocal enableDelayedExpansion
echo !m!

Pour sortir dans un tube, nous devons remplacer tout & 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" permet une expansion différée:

cmd /v /c echo !m!

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

cmd /v /c echo !m! | clip

Simple.

11
Denis Howe

Si vous avez besoin de echo, une chaîne contenant une esquisse, ne sera d'aucun secours, car vous les verrez également dans le résultat. Dans ce 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
1
Jaroslav Záruba

Ajouter ceci pour les futurs utilisateurs - 

SI vous avez des espaces dans le nom du fichier ET que vous avez un caractère que vous devez échapper: vous pouvez utiliser des guillemets simples ET ET pour éviter les erreurs de nom dans la commande.

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

Le caractère ^ échappe aux guillemets 

édité pour inclure le . de fermeture à la fin de la commande

0
be-ns