Une remarque supplémentaire à la réponse de FrVaBe .
Normalement, le ^^!
fonctionne, mais entre guillemets, vous n'avez besoin que de ^!
à la place.
echo I want to go out with a bang^^!
echo He said "Bang^!"
C'est le résultat du mécanisme d'échappement de l'analyseur syntaxique de lot.
Tout d'abord, l'analyseur syntaxique analyse une ligne et le signe d'insertion échappe le caractère suivant, dans ce cas, il a un effet pour &|<>()"<linefeed>
mais seulement en dehors des guillemets, car à l'intérieur des guillemets, tous les caractères sont "normaux" et le signe d'insertion lui-même n'a aucun effet.
Avec l'expansion retardée, une étape d'analyse supplémentaire suit, le signe d'insertion est également un caractère d'échappement pour le caractère suivant, mais il n'affecte que le caractère d'insertion. !
et ^
et les guillemets sont ignorés dans cette étape d'analyse. Cette étape supplémentaire ne sera exécutée que s'il y a au moins un fichier de type !
dans la ligne.
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^!"
---- SORTIE ------
DisableDelayedExpansion
one caret^
one caret^ bang! "boom^!"
EnableDelayedExpansion
one caret^
none caret bang! "boom!"
EDIT
Voici un exemple légèrement modifié qui illustre mieux les différentes permutations d'échappement qui sont nécessaires, selon le contexte. Le seul cas qui nécessite un échappement inhabituel est le dernier exemple, lorsque l'expansion retardée est activée et qu'il existe au moins un fichier !
sur la ligne.
@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^!"
-- OUTPUT --
DisableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
EnableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"