Dodatkowa uwaga do answer z FrVaBe.
Normalnie ^^!
działa, ale w cudzysłów wystarczy tylko ^!
.
echo I want to go out with a bang^^!
echo He said "Bang^!"
Jest to wynik mechanizmu ewakuacji analizatora wsadowego.
Najpierw analizator analizuje linię, a kreska ucieka z następnego znaku, w tym przypadku ma wpływ na &|<>()"<linefeed>
, ale tylko poza cudzysłowami, ponieważ w cudzysłowie wszystkie znaki są "normalne", a sam znacznik ma bez efektu.
Po rozwinięciu z opóźnieniem następuje dodatkowy krok parse, znak karetki jest także znakiem pomocniczym dla następnego znaku, ale wpływa tylko na !
i ^
, a cytaty są ignorowane w tym etapie analizy. Ten dodatkowy krok zostanie wykonany, jeśli w linii znajduje się co najmniej jeden !
.
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^!"
---- WYJŚCIE ------
DisableDelayedExpansion
one caret^
one caret^ bang! "boom^!"
EnableDelayedExpansion
one caret^
none caret bang! "boom!"
EDIT
Tu jest nieco zmodyfikowany przykład, który lepiej ilustruje różne permutacje ucieczki, które są wymagane, w zależności od kontekstu. Jedyny przypadek wymagający nietypowego ucieczki jest ostatnim przykładem, kiedy opóźnione rozwijanie jest włączone i istnieje co najmniej jeden !
na linii.
@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^!"
- WYJŚCIE -
DisableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
EnableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
Oszałamiająca, dziękuję –
Btw, jeśli musiałbyś zamienić znak wykrzyknika wewnątrz zmiennej, jak byś to zrobił? – crosenblum
@crosenblum Polecam to pytanie jako własne pytanie. Niż będzie to visbile dla wszystkich członków SO i najprawdopodobniej odpowiedział. – FrVaBe