¿Cómo escapo los símbolos en un archivo por lotes (o desde la línea de comandos de Windows) para usar el start
comando para abrir páginas web con símbolos en la URL?
Las comillas dobles no funcionarán start
; Esto inicia una nueva ventana de línea de comandos.
Actualización 1 : la solución de Wael Dalloul funciona. Además, si hay caracteres codificados en 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 comando:
'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.
windows
batch-file
escaping
ampersand
Peter Mortensen
fuente
fuente
start
que hace que la cita del argumento falle si se aplica sin pensar. Y en general, creo que encerrar el argumento entre comillas es más fácil y menos propenso a errores que escapar de cada personaje que necesita escapar allí.+
qué debo poner delante para escapar?start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
funciona porque PowerShell eliminará las citasRespuestas:
De un cmd :
&
se escapa así:^&
(basado en la respuesta de @Wael Dalloul )%
no necesita ser escapadoUn ejemplo:
Desde un archivo por lotes
&
se escapa así:^&
(basado en la respuesta de @Wael Dalloul )%
se escapa así:%%
(basado en la actualización de los OP)Un ejemplo:
fuente
%
no es necesario escapar, porque ¿quién sería lo suficientemente tonto como para definirlo20and
como una variable de entorno? Si lo hizo,start http://www.google.com/search?q=ampersand%20and%20percentage
podría vincular a en suhttp://www.google.com/search?q=ampersandsomething-silly20percentage
lugar. Usando^%
para escapar en cmd, el ejemplo funciona como se esperaba.&
se usa para separar comandos. Por lo tanto, puede utilizar^
para escapar de la&
.fuente
+
qué debo poner delante para escapar?^
sería invaluable.Puede encerrarlo entre comillas, si proporciona un primer argumento ficticio.
Tenga en cuenta que debe proporcionar un primer argumento ficticio en este caso, ya
start
que 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í):fuente
start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
fuente
El comando
funciona como se esperaba, generando
El comando
también funciona, escribiendo la cadena en el archivo "tmp". Sin embargo, antes de una pipa
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 luego "eso" dará un error. Diciendo
pondrá las cadenas "this" y "that" en el portapapeles.
Sin el ^:
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 redirige, ^ no cita el &, sino que hace que se aplique antes de la redirección en lugar de después.
Para canalizar un &, debe citarlo dos veces
Si pones la cadena en una variable
luego
saldrá
pero lo obvio
falla porque, después de que Windows sustituye la variable, lo que resulta en
analiza esto como un nuevo comando e intenta ejecutar "eso".
En un archivo por lotes, puede usar la expansión retrasada :
Para enviar a una tubería, tenemos que reemplazar todos los & s en el valor de la variable con ^ &, lo que podemos hacer con la sintaxis% VAR: FROM = TO%:
En la línea de comando, "cmd / v" permite la expansión retrasada:
Esto funciona incluso cuando se escribe en una tubería
Sencillo.
fuente
echo this ^^^& that | clip
funciona también. Para comprender el manejo de la tubería mágica, puede leer SO: ¿Por qué falla la expansión retardada cuando se encuentra dentro de un bloque de código canalizado?Si necesita
echo
una cadena que contenga un ampersand, las comillas no ayudarán, porque también las vería en la salida. En tal caso, usefor
:... en un script por lotes:
o
fuente
Si tiene espacios en el nombre del archivo y tiene un personaje del que debe escapar:
Puede usar comillas simples Y dobles para evitar cualquier nombre inapropiado en el comando.
El
^
personaje escapa a las comillas de lo contrario.fuente