ss64 escape characters caracter batch windows batch-file escaping

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



escape 2 (7)

¿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 codificación 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.


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


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 sintaxis% 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.


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"


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


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


Desde un cmd :

  • & se escapó así: ^& (basado en la answer @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 answer @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


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