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=...."