2013-01-16 10 views
21

Piszę plik wsadowy, w którym muszę wypisać ciąg zawierający "!" do innego pliku. Ale kiedy wysyłam ten ciąg do innego pliku, usuwa on "!" z wyjścia.Różnica między zmienną% zmienna% i!! w pliku wsadowym

Np Wejście:

set LINE=Hi this is! output 
echo !LINE!>>new_file.txt 

Wyjście w new_file.txt jest:

Hi this is output 

Ponadto, jeśli wejście jest

set LINE=Hello!! this is output!! 
echo !LINE!>>new_file.txt 

Wyjście w new_file.txt:

Hello 

W związku z tym pomija! (Wykrzyknik) z pliku wyjściowego do pliku new_file. Jeśli używam% LINE%, to po prostu wyświetla się "echo jest włączone" w pliku wyjściowym.

Proszę zaproponować sposób na przezwyciężenie tego problemu.

+1

Gdy 'echo% linii%' wyjścia 'echo on' to musisz być w bloku. Powinieneś dodać nieco więcej swojego kodu. – jeb

+1

Pytanie jest bardzo mylące, nie chcesz znać różnicy, chcesz wiedzieć, jak uciec ... –

Odpowiedz

15

Jeśli włączone jest opóźnione rozwijanie i chcesz wyprowadzić wykrzyknik, musisz go usunąć.

Ucieczka z wykrzykników nie wymaga żadnej, jednej lub dwóch uchwytów, w zależności od umieszczenia.

@echo off 
set test1=Test1! 
setlocal EnableDelayedExpansion 
set test2=Test2^^! 
set "test3=Test3^!" 

echo !test1! 
echo !test2! 
echo !test3! 

Różnica !var! i %var% w blokach określono na DOS batch: Why are my set commands resulting in nothing getting stored?

Wyjaśnienie parser partii można znaleźć w How does the Windows Command Interpreter (CMD.EXE) parse scripts?

4

Wygląda na to, że zadzwoniłeś pod numer SETLOCAL EnableDelayedExpansion gdzieś wyżej. Spójrz na here, aby zobaczyć, jakie są tego efekty.

+0

Dziękuję za odpowiedź. Tak, używam tego Właściwość w moim pliku, ponieważ ten kod znajduje się w pętli for, a także wykonuję niektóre operacje find/replace na tym łańcuchu, więc muszę go użyć. – Vishal

+0

@Użytkownik, który wysłałem, dał ci dobre wyjaśnienie efektów ubocznych tego. Mam nadzieję, że pomoże ci zrozumieć zachowanie, które obserwujesz. –

Powiązane problemy