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!"
Impresionante, gracias –
Por cierto, si tuviera que reemplazar un signo de exclamación dentro de una variable, ¿cómo lo haría? – crosenblum
@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