Eine zusätzliche Bemerkung zum answer von FrVaBe.
Normalerweise funktioniert die ^^!
, aber in Anführungszeichen benötigen Sie nur ^!
statt.
echo I want to go out with a bang^^!
echo He said "Bang^!"
Dies ist ein Ergebnis des Escape-Mechanismus des Batch-Parsers.
Zuerst parst der Parser eine Zeile und das Caret entkommt dem nächsten Zeichen, in diesem Fall hat es einen Effekt für &|<>()"<linefeed>
, aber nur außerhalb von Anführungszeichen, da innerhalb der Anführungszeichen alle Zeichen "normal" sind und das Caret selbst hat Kein Effekt.
Mit verzögerter Erweiterung folgt ein zusätzlicher Parse-Schritt, dort ist die Einfügemarke auch ein Escape-Zeichen für das nächste Zeichen, aber nur die !
und ^
, und Anführungszeichen werden in diesem Parsing-Schritt ignoriert. Dieser zusätzliche Schritt wird nur ausgeführt, wenn mindestens eine !
in der Zeile vorhanden ist.
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!"
EDIT
Hier ist ein leicht modifiziertes Beispiel, dass besser auf die verschiedenen Flucht Permutationen zeigt, die erforderlich, abhängig vom Kontext. Der einzige Fall, der ein ungewöhnliches Entweichen erfordert, ist das letzte Beispiel, wenn die verzögerte Erweiterung aktiviert ist und mindestens ein !
auf der Leitung vorhanden ist.
@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!"
Atemberaubend, danke –
BTW, wenn Sie ein Ausrufezeichen in einer Variablen ersetzen müssten, wie würden Sie das tun? – crosenblum
@crosenblum Ich würde empfehlen, dies als eine eigene Frage zu stellen. Dann wird es für alle SO-Mitglieder sichtbar und höchstwahrscheinlich beantwortet. – FrVaBe