¿Cómo puedo escapar de ampersands en archivos por lotes?


¿Cómo escape ampersands en un archivo por lotes (o desde el Línea de comandos de Windows) con el fin de utilizar el comando start para ¿abrir páginas web con ampersands en la URL?

Las comillas dobles no funcionarán con start; esto inicia una nueva ventana de línea de comandos en su lugar.

Actualización 1: La solución de Wael Dalloul funciona. Además, si hay caracteres codificados URL (por ejemplo, el espacio está codificado como %20) en la URL y está en un archivo por lotes entonces ' % ' debe ser codificado como'%%'. Este no es el caso en el ejemplo.

Ejemplo, desde la línea de comandos(CMD.EXE):

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

Dará lugar a

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

Se abre en el navegador predeterminado y estos errores en la ventana de línea de comandos:

'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.

Plataforma: Windows XP 64 bit SP2.

Author: Peter Mortensen, 2009-08-25

7 answers

De un cmd :

  • {[2] } se escapa así: ^& (basado en la respuesta de @Wael Dalloul )
  • % no necesita ser escapado

Un ejemplo:

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

Desde un archivo por lotes

  • {[2] } se escapa así: ^& (basado en la respuesta de @Wael Dalloul )
  • % se escapa así: %% (basado en la actualización de OPs)

Un ejemplo:

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
 57
Author: Lasse Christiansen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:05

& se utiliza para separar comandos. Por lo tanto, puede usar ^ para escapar del &.

 133
Author: Wael Dalloul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-06 11:10:12

Puede encerrarlo entre comillas, si proporciona un primer argumento ficticio.

Tenga en cuenta que debe proporcionar un primer argumento ficticio en este caso, ya que start tratará el primer argumento como un título para las nuevas ventanas de la consola, si está citado. Así que lo siguiente debería funcionar (y lo hace aquí):

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
 25
Author: belugabob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-17 13:49:07
explorer "http://www.google.com/search?client=opera&rls=...."
 18
Author: adatapost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-17 19:32:39

El comando

echo this ^& that

Funciona como se esperaba, produciendo

this & that

El comando

echo this ^& that > tmp

También funciona, escribiendo la cadena en el archivo "tmp". Sin embargo, antes de una tubería

echo this ^& that | clip

El ^ se interpreta de manera completamente diferente. Intenta escribir la salida de los dos comandos "echo this" y "that" a la tubería. El eco funcionará entonces " que " dará un error. Diciendo:

echo this ^& echo that | clip

Pondrá las cadenas "this " y" that " en el portapapeles.

Sin el^:

echo this & echo that | clip

El primer eco escribirá en la consola y solo la salida del segundo eco será canalizada a clip (de manera similar para la redirección "> tmp"). Por lo tanto, cuando la salida se redirige, el ^ no cita el&, sino que hace que se aplique antes de la redirección en lugar de después.

Para canalizar un&, tienes que citarlo dos veces{[17]]}

echo this ^^^& that | clip

Si pones la cadena en una variable

set m=this ^& that

Entonces

set m

Will salida

m=this & that

Pero lo obvio

echo %m%

Falla porque, después de que Windows sustituye la variable, resulta en

echo this & that

Analiza esto como un nuevo comando e intenta ejecutar "that".

En un archivo por lotes, puede usar expansión retardada :

setlocal enableDelayedExpansion
echo !m!

Para dar salida a una tubería, tenemos que reemplazar all & s en el valor de la variable con^&, lo que podemos hacer con la sintaxis % VAR: FROM = TO%:

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

En la línea de comandos, "cmd / v" habilita expansión diferida:

cmd /v /c echo !m!

Esto funciona incluso cuando se escribe en una tubería

cmd /v /c echo !m! | clip

Simple.

 10
Author: Denis Howe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-23 13:28:46

Si necesita echo una cadena que contenga comillas ampersand no ayudará, porque también las verá en la salida. En tal caso use for:

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

In en un script por lotes:

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

O

for %%a in ("%~1") do echo %%~a
 0
Author: Jaroslav Záruba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-19 12:10:02

Añadiendo esto para futuros usuarios –

SI tiene espacios en el nombre del archivo y tiene un carácter que necesita para escapar: puede usar comillas simples Y dobles para evitar nombres incorrectos en el comando.

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

El carácter ^ escapa de las comillas de lo contrario

editado para incluir el cierre . al final del comando

 0
Author: be-ns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-01 23:01:58