¿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.
7 answers
De un cmd :
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
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 &
.
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"
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=...."
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.
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
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
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