¿Cómo escapo los ampersands en los archivos por lotes?

¿Cómo puedo escapar de los símbolos de unión en un archivo por lotes (o desde la línea de comandos de Windows) para utilizar el comando de start para abrir páginas web con ampersands en la URL?

Las comillas dobles no funcionarán con el start ; esto comienza 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 con encoding URL (por ejemplo, el espacio está codificado como% 20) en la URL y está en un archivo por lotes, entonces ‘%’ debe codificarse como ‘%%’. Este no es el caso en el ejemplo.

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

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

resultará en

 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.

Desde un cmd :

  • & se escapó 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 

De un archivo por lotes

  • & se escapó así: ^& (basado en la respuesta de @Wael Dalloul)
  • % se escapó 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 

& se usa para separar comandos Por lo tanto, puede usar ^ para escapar de & .

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 se cita. Entonces, 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" 
 explorer "http://www.google.com/search?client=opera&rls=...." 

El comando

 echo this ^& that 

funciona como se esperaba, produciendo

 this & that 

El comando

 echo this ^& that > tmp 

también funciona, escribiendo la cadena para archivar “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” en la tubería. El eco funcionará y “eso” dará un error. Diciendo

 echo this ^& echo that | clip 

pondrá las cuerdas “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 se canalizará al clip (de manera similar para la redirección “> tmp”). Por lo tanto, cuando la salida se está redirigiendo, ^ no cita el signo &, sino que hace que se aplique antes de la redirección en lugar de hacerlo después.

Para canalizar un &, debes citarlo dos veces

 echo this ^^^& that | clip 

Si pones la cuerda en una variable

 set m=this ^& that 

entonces

 set m 

saldrá

 m=this & that 

pero lo obvio

 echo %m% 

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

 echo this & that 

lo analiza como un nuevo comando e intenta ejecutar “eso”.

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

 setlocal enableDelayedExpansion echo !m! 

Para enviar a una tubería, debemos reemplazar all & s en el valor de la variable con ^ &, lo cual podemos hacer con la syntax% VAR: FROM = TO%:

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

En la línea de comando, “cmd / v” habilita la expansión retrasada:

 cmd /v /c echo !m! 

Esto funciona incluso cuando escribes a un tubo

 cmd /v /c echo !m! | clip 

Sencillo.

Si necesita hacer echo una cadena que contiene un signo de &, las comillas no servirán de ayuda, ya que también las verá en la salida. En tal caso, use for :

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

… en un script por lotes:

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

o

 for %%a in ("%~1") do echo %%~a 

Agregando esto para futuros usuarios –

SI tiene espacios en el nombre del archivo Y tiene un personaje del que necesita escapar: puede usar comillas simples Y dobles para evitar cualquier error en el comando.

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

El caracter ^ escapa de las comillas

editado para incluir el cierre . al final del comando