2010-07-20 16 views
58

Wenn ich setlocal ENABLEDELAYEDEXPANSION in einem Cmd-Skript gesetzt habe, gibt es einen Weg, ich kann entkommen! das ich als Parameter für einen Befehl verwenden möchte?Wie kann ich ein Ausrufezeichen entkommen! in cmd-Skripten?

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

Antwort

66

Das ist, was ich gefunden (^^)

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

Atemberaubend, danke –

+2

BTW, wenn Sie ein Ausrufezeichen in einer Variablen ersetzen müssten, wie würden Sie das tun? – crosenblum

+2

@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

54

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!" 
+0

@dbenham danke für die zusätzlichen Beispiele – jeb

5

Dank. „“ Um zu dieser wertvollen Punkt hinzufügen, wenn man das Skript eine Variable enthält, deren Wert ein enthält, dann wird der folgende Ansatz diesen Wert machen, wie sie ist:

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

Bitte unter dem Beispiel finden, um, wie wir können, Verwenden Sie Ausrufezeichen Variable in DISABLEDELAYEDEXPANSION und ENABLEDELAYEDEXPANSION Zustand.

+0

Beste Antwort! Dies löst die Verwendung in Skripten, in denen DELAYEDEXPANSION benötigt wird. – JasonXA

+0

Eigentlich - keine gute Antwort, würde ich Entfernung vorschlagen. Grund: SETLOCAL ist speicherintensiv und Sie möchten es so wenig wie möglich verwenden. – Lockszmith

+0

Das ist aberrierend. Nirgendwo in den Anforderungen ist Speicher ein Problem, und doch benutze ich es sehr ohne irgendwelche negativen Auswirkungen. Wenn du nichts beitragen kannst, behalte deinen Unsinn für dich. – JasonXA

Verwandte Themen