2010-07-20 12 views
58

Kiedy mam setlocal ENABLEDELAYEDEXPANSION ustawiony w skrypcie cmd jest jakikolwiek sposób, w jaki mogę uciec! który chcę użyć jako parametr do polecenia?Jak mogę uciec od wykrzyknika! w skryptach cmd?

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

Odpowiedz

66

To co znalazłem (^^)

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

Oszałamiająca, dziękuję –

+2

Btw, jeśli musiałbyś zamienić znak wykrzyknika wewnątrz zmiennej, jak byś to zrobił? – crosenblum

+2

@crosenblum Polecam to pytanie jako własne pytanie. Niż będzie to visbile dla wszystkich członków SO i najprawdopodobniej odpowiedział. – FrVaBe

54

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

@dbenham dzięki za dodatkowe przykłady – jeb

5

Dzięki. „!”, Aby dodać do tego cennego punktu, jeśli czyjaś skrypt zawiera zmienną, której wartość zawiera, wówczas następujące podejście spowoduje, że wartość jak jest:

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

Poniżej znajduje się przykład, w jaki sposób możemy użyj zmiennej wykrzyknika w stanie DISABLEDELAYEDEXPANSION i ENABLEDELAYEDEXPANSION.

@echo off 
setlocal DISABLEDELAYEDEXPANSION 
set DB_password=encrypt!Pws 
echo %DB_password% 
SETLOCAL ENABLEDELAYEDEXPANSION 
echo !DB_password! 
+0

Najlepsza odpowiedź! Rozwiązuje to użycie skryptów, w których potrzebny jest OPÓŹNIONY OPÓR. – JasonXA

+0

Właściwie - nie jest to dobra odpowiedź, sugerowałbym usunięcie. Powód: SETLOCAL jest kosztowny pamięci i chcesz go używać tak mało, jak to możliwe. – Lockszmith

+0

To jest aberracyjne. Nigdzie w wymaganiach pamięć nie budzi obaw, a mimo to używam jej dużo bez złego efektu. Jeśli nie możesz wnieść wkładu, zachowaj swoje bzdury dla siebie. – JasonXA

Powiązane problemy