2010-07-20 20 views

Respuesta

66

Eso es lo que encontré (^^)

@echo off 
setlocal ENABLEDELAYEDEXPANSION 
echo I want to go out with a bang^^! 
+4

Impresionante, gracias –

+2

Por cierto, si tuviera que reemplazar un signo de exclamación dentro de una variable, ¿cómo lo haría? – crosenblum

+2

@crosenblum Yo recomendaría hacer esto como una pregunta propia. Que será visible para todos los miembros de SO y lo más probable es que responda. – FrVaBe

54

Una observación adicional a la answer de FrVaBe.

Normalmente funciona el ^^!, pero entre comillas solo necesita ^!.

echo I want to go out with a bang^^! 
echo He said "Bang^!" 

Esto es un resultado del mecanismo de escape del analizador de proceso por lotes.

Primero, el analizador analiza una línea y el símbolo de intercalación escapa al siguiente carácter, en este caso tiene un efecto para &|<>()"<linefeed>, pero solo fuera de comillas, ya que dentro de las comillas todos los caracteres son "normales" y el cursor tiene sin efecto.

Con la expansión retrasada, se sigue un paso de análisis adicional, hay un carácter de escape para el siguiente carácter, pero solo afecta a ! y ^, y las comillas se ignoran en este paso de análisis. Este paso adicional se ejecutará solamente, si hay al menos un ! en la línea.

setlocal DisableDelayedExpansion 
echo DisableDelayedExpansion 
echo one caret^^ 
echo one caret^^ bang! "boom^!" 

echo(
setlocal EnableDelayedExpansion 
echo EnableDelayedExpansion 
echo one caret^^ 
echo none caret^^ bang^^! "boom^!" 

---- OUTPUT ------

DisableDelayedExpansion 
one caret^ 
one caret^ bang! "boom^!" 

EnableDelayedExpansion 
one caret^ 
none caret bang! "boom!" 


EDITAR

Aquí está un ejemplo ligeramente modificada que mejor ilustra las diversas permutaciones de escape que son requerido, dependiendo del contexto. El único caso que requiere un escape inusual es el último ejemplo cuando la expansión retrasada está activada y existe al menos un ! en la línea.

@echo off 
setlocal DisableDelayedExpansion 
echo DisableDelayedExpansion 
echo caret^^  "caret^" 
echo caret^^ bang! "caret^ bang!" 

echo(
setlocal EnableDelayedExpansion 
echo EnableDelayedExpansion 
echo caret^^  "caret^" 
echo caret^^^^ bang^^! "caret^^ bang^!" 

- SALIDA -

DisableDelayedExpansion 
caret^  "caret^" 
caret^ bang! "caret^ bang!" 

EnableDelayedExpansion 
caret^  "caret^" 
caret^ bang! "caret^ bang!" 
+0

@dbenham gracias por los ejemplos adicionales – jeb

5

Gracias. "!" Para añadir a este punto valioso, si la escritura de uno contiene una variable cuyo valor contiene una, entonces el siguiente enfoque hará que ese valor tal y como son:

 
@echo off 
SETLOCAL EnableDelayedExpansion 
set /P omg=Enter a value that contains an exclamation-point: 
echo Traditional: %omg% 
echo Alternative: !omg! 
pause 
4

A continuación encontrará un ejemplo, a la forma en que puede use la variable de exclamación en DISABLEDELAYEDEXPANSION y estado ENABLEDELAYEDEXPANSION.

@echo off 
setlocal DISABLEDELAYEDEXPANSION 
set DB_password=encrypt!Pws 
echo %DB_password% 
SETLOCAL ENABLEDELAYEDEXPANSION 
echo !DB_password! 
+0

¡La mejor respuesta! Esto resuelve el uso en scripts donde se necesita DELAYEDEXPANSION. – JasonXA

+0

En realidad, no es una buena respuesta, le sugiero que la elimine. Motivo: SETLOCAL es caro para la memoria y desea utilizarlo lo menos posible. – Lockszmith

+0

Eso es aberrativo. En ninguna parte de los requisitos la memoria es una preocupación y, sin embargo, la uso mucho sin ningún efecto negativo. A menos que puedas contribuir, guarda tus tonterías para ti mismo. – JasonXA

Cuestiones relacionadas