¿Cómo escapo los símbolos en archivos por lotes?

146

¿Cómo escapo los símbolos en un archivo por lotes (o desde la línea de comandos de Windows) para usar el startcomando 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.

Peter Mortensen
fuente
1
He editado la respuesta de belugabob para que funcione ahora. Es solo una peculiaridad en la startque 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í.
Joey el
¿Qué pasa con el signo más, +qué debo poner delante para escapar?
william
En PowerShell 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 citas
phuclv

Respuestas:

91

De un cmd :

  • &se escapa 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

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:

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
Lasse Christiansen
fuente
También podría incluir un ejemplo de escape de "%", entonces puedo limpiar mi pregunta.
Peter Mortensen
@PeterMortensen Definitivamente: he actualizado mi respuesta.
Lasse Christiansen
2
¿De qué personajes también debería escapar? Noté que tengo que escapar "|" por "^ |".
liquide
En este caso %no es necesario escapar, porque ¿quién sería lo suficientemente tonto como para definirlo 20andcomo una variable de entorno? Si lo hizo, start http://www.google.com/search?q=ampersand%20and%20percentagepodría vincular a en su http://www.google.com/search?q=ampersandsomething-silly20percentagelugar. Usando ^%para escapar en cmd, el ejemplo funciona como se esperaba.
TamaMcGlinn
145

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

Wael Dalloul
fuente
3
¿Qué pasa con el signo más, +qué debo poner delante para escapar?
william
Esta es la solución aplicable más general. También funciona si un parámetro de un programa de línea de comandos tiene uno o más símbolos en él. Acabo de encontrar esto: el parámetro era CGW5COMM y 10C4 y 8301 .
Peter Mortensen
Citar un ampersand con el carácter de caret ^ no parece funcionar en todas las circunstancias. Por ejemplo, intentar ejecutar msdeploy.exe con el / p: modificador para pasar una contraseña con un signo y no parece funcionar con ninguna permutación que he intentado (comillas, comillas dobles, primer argumento ficticio).
Derek Greer
3
Un ejemplo de uso ^sería invaluable.
jpmc26
2
@ jpmc26 He agregado un ejemplo en esta respuesta .
Lasse Christiansen
29

Puede encerrarlo entre comillas, si proporciona un primer argumento ficticio.

Tenga en cuenta que debe proporcionar un primer argumento ficticio en este caso, ya startque 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"
belugabob
fuente
OK, admitiré que el título no coincide completamente con la pregunta en el interior. (¿Crees que debería alargar el título?)
Peter Mortensen
No tan 'Doh', después de todo, encerrar entre comillas era la idea correcta, simplemente no sabía sobre el título de la ventana de la consola. Gracias Johannes!
belugabob
PowerShell eliminará las citas de los argumentos , por lo que esto fallará. start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
Debe
20
explorer "http://www.google.com/search?client=opera&rls=...."
Adatapost
fuente
12

El comando

echo this ^& that

funciona como se esperaba, generando

this & that

El comando

echo this ^& that > tmp

también funciona, escribiendo la cadena en el archivo "tmp". Sin embargo, antes de una pipa

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 luego "eso" 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 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

echo this ^^^& that | clip

Si pones la cadena en una variable

set m=this ^& that

luego

set m

saldrá

m=this & that

pero lo obvio

echo %m%

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

echo this & that

analiza esto 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, tenemos que reemplazar todos los & 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 comando, "cmd / v" permite la expansión retrasada:

cmd /v /c echo !m!

Esto funciona incluso cuando se escribe en una tubería

cmd /v /c echo !m! | clip

Sencillo.

Denis Howe
fuente
Su solución para tuberías funciona, pero sus conclusiones son más o menos erróneas. Por cierto. Un simple echo this ^^^& that | clipfunciona 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?
jeb
1

Si necesita echouna cadena que contenga un ampersand, las comillas no ayudarán, porque también las vería 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
Jaroslav Záruba
fuente
0

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.

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

El ^personaje escapa a las comillas de lo contrario.

be-ns
fuente