Strona 1 z 16
BAT
Podstawowe informacje o składni
Strona 2 z 16
Instrukcja warunkowa (1)
Niemal wszystkie wykonywane programy podczas pracy są "zmuszane przez użytkownika" do podejmowania pewnych decyzji. Program niejednokrotnie musi decydować jakiego rodzaju informacje powinien wyświetlić, czy w danym momencie zareagować na klawisze naciskane na klawiaturze, jaką operację należy wykonać, czy zakończyć swoje działanie, itp.
Do podejmowania w programach tego typu decyzji służy instrukcja warunkowa. W pliku wsadowym instrukcja ta może mieć jedną z trzech postaci.
IF EXIST plik komenda albo
IF NOT EXIST plik komenda
PRZYKŁAD:
@ECHO OFF
IF EXIST lista.txt COPY lista.txt lista.bak > NUL
Strona 3 z 16
Instrukcja warunkowa (2)
Druga postać instrukcji warunkowej dotyczy porównywania napisów:
IF "napis1" == "napis2" komenda albo
IF NOT "napis1" == "napis2" komenda
Strona 4 z 16
Instrukcja ETYKIETA :Etykieta
definiuje tzw. etykietę w pliku wsadowym. Etykieta to inaczej mówiąc słowna nazwa linii pliku, umieszczając instrukcję etykiety nazywamy linię pliku podaną po znaku ':' nazwą. Nazwa
etykiety powinna być jednym słowem nie zawierającym odstępów (można połączyć słowa
znakiem '_') i powinna rozpoczynać się tuż za znakiem ':', nie należy rozdzielać nazwy i znaku ':' odstępami.
Podczas wykonywania pliku wsadowego interpreter pomija linie pliku zawierające etykiety (podobnie jak ma ty miejsce w przypadku polecenia komentarza REM), instrukcji tej nie wykonuje się, służy ona jedynie do przenoszenia wykonywania pliku przez instrukcję skoku GOTO:
GOTO Etykieta PRZYKŁAD:
@ECHO OFF
IF EXIST lista.txt GOTO Usuwaj ECHO Nie ma takiego pliku...
GOTO Koniec
Strona 5 z 16
Argumenty plików wsadowych
Podobnie jak polecenia i programy pliki wsadowe można uruchamiać z argumentami. Do poszczególnych argumentów pliku można się od odwoływać za pomocą symboli %1, %2, ...,
%9, które reprezentują odpowiednio pierwszy, drugi, ..., dziewiąty argument pliku.
Przykład:
@ECHO OFF
IF EXIST %1 GOTO Usuwaj
ECHO Plik %1 nie istnieje...
GOTO Koniec
:Usuwaj
ECHO Usuwanie pliku %1 ...
DEL %1 > NUL
ECHO Wykonane...
Strona 6 z 16
Przykład 2:
IF "%1" == "/?" GOTO Informacja IF "%1" == "" GOTO BrakArgumentu
IF NOT "%2" == "" GOTO ZbytWieleArgumentow
IF EXIST %1 GOTO Usuwaj
Strona 7 z 16
Instrukcja CALL
Jak wspomniano na początku w pliku wsadowym można używać dowolnych poleceń
wewnętrznych i programów wykonywalnych (com i exe). Polecenie pliku wsadowego nie może natomiast być plikiem wsadowym. Uruchomienie w pliku wsadowym innego pliku wsadowego wymaga zastosowania polecenia:
CALL plik_wsadowy [argumenty]
PRZYKŁAD:
IF "%1" == "" GOTO Koniec
CALL myBat.bat %1
Strona 8 z 16
Instrukcja SHIFT
Do tej pory stosowane były instrukcje skoku zawsze do etykiety położonej "poniżej" w pliku wsadowym. Istnieje możliwość przeniesienia wykonywania pliku do linii wcześniejszej, czyli
"powyżej" - tego typu konstrukcję, tzn. etykietę oraz występującą poniżej instrukcję skoku do tej właśnie etykiety nazywamy pętlą.
Pętle często stosuje się w połączeniu z instrukcją SHIFT. Polecenie SHIFT wykonuje tzw.
przesunięcie argumentów, tzn. argument pierwszy %1 zastępowany jest przez argument drugi
%2, argument drugi %2 zastępowany jest przez argument trzeci %3, itd. Ogólnie: argument %N
zastępowany jest przez argument %(N+1).
Strona 9 z 16
UWAGA:
W wyniku wykonania polecenia argument pierwszy pliku wsadowego jest bezpowrotnie tracony - nie ma możliwości odwołania się do tego argumentu. Demonstruje to poniższy przykład:
@ECHO OFF
ECHO Arg1=[%1] Arg2=[%2] Arg3=[%3] Arg4=[%4]
SHIFT
ECHO Arg1=[%1] Arg2=[%2] Arg3=[%3] Arg4=[%4]
SHIFT
ECHO Arg1=[%1] Arg2=[%2] Arg3=[%3] Arg4=[%4]
SHIFT
ECHO Arg1=[%1] Arg2=[%2] Arg3=[%3] Arg4=[%4]
SHIFT
ECHO Arg1=[%1] Arg2=[%2] Arg3=[%3] Arg4=[%4]
SHIFT
ECHO Arg1=[%1] Arg2=[%2] Arg3=[%3] Arg4=[%4]
Tak wygląda wykonanie pliku z pięcioma argumentami:
C:\TEMP>argumen.bat list1.txt list2.txt list3.txt list4.txt list5.txt Arg1=[list1.txt] Arg2=[list2.txt] Arg3=[list3.txt] Arg4=[list4.txt]
Arg1=[list2.txt] Arg2=[list3.txt] Arg3=[list4.txt] Arg4=[list5.txt]
Arg1=[list3.txt] Arg2=[list4.txt] Arg3=[list5.txt] Arg4=[]
Arg1=[list4.txt] Arg2=[list5.txt] Arg3=[] Arg4=[]
Arg1=[list5.txt] Arg2=[] Arg3=[] Arg4=[]
Arg1=[] Arg2=[] Arg3=[] Arg4=[]
Strona 10 z 16
PRZYKŁAD 2:
:Start
IF "%1" == "" GOTO Koniec ECHO %1
SHIFT
GOTO Start
:Koniec
Strona 11 z 16
Instrukcja warunkowa (3)
I to chyba jest ten moment, który nazwać można "wyższą szkołą jazdy"...
Ale najpierw trochę niezbędnej teorii.
Kiedy program kończy swoje działanie ma możliwość poinformowania systemu operacyjnego o stanie swojego zakończenia. Przekazana informacja jest dosyć uboga albowiem może być
zaledwie nieujemną liczbą całkowitą, ale o tym, że w świecie komputerów jedna liczba może być informacją bardzo obszerną nikogo przekonywać nie trzeba. Liczbę tą nazywamy kodem wyjścia programu.
Z możliwości tej programy nie zawsze korzystają i często program nie pozostawia po sobie żadnej informacji - wówczas system operacyjny traktuje taki stan zakończenia jako poprawny i przyjmuje, że zakończony program pozostawił po sobie kod zero (często mówimy też, że
program zakończył się z kodem zero). Nie oznacza to wcale, że liczby różne od zera oznaczają błędne zakończenie programu; jest to często przyjmowana w informatyce reguła na mocy której liczba zero oznacza poprawne wykonanie określonej operacji.
Instrukcja warunkowa w trzeciej postaci służy właśnie do sprawdzania stanu zakończenia ostatnio wykonanego programu lub komendy:
IF ERRORLEVEL kod_wyjścia komenda albo
IF NOT ERRORLEVEL kod_wyjścia komenda
Strona 12 z 16
Kod wyjścia jest tutaj liczbą naturalną, komenda poleceniem do wykonania. Instrukcja w tej postaci wykona podaną komendę tylko wówczas, gdy ostatnio wykonywane polecenie zwróciło kod wyjścia większy lub równy podanej liczbie (w przypadku użycia NOT mniejszy od podanej liczby).
Z tej postaci instrukcji warunkowej korzystać będziemy wyłącznie przy sprawdzaniu kodu wyjścia polecenia CHOICE, które stosuje się w systemie MS-DOS do zadawania różnego rodzaju pytań. Składnia polecenia jest następująca:
CHOICE [/C:odpowiedzi] [/N] [/T:Z,XY] [tekst]
PRZYKŁAD:
ECHO [ 1 ]. Norton Commander ECHO [ 2 ]. Turbo Pascal
ECHO [ 3 ]. Windows ECHO [ Q ]. Zakończ
CHOICE /C:123Q /N "Wybierz program do uruchomienia : "
IF ERRORLEVEL 4 GOTO Koniec IF ERRORLEVEL 3 GOTO Windows IF ERRORLEVEL 2 GOTO Pascal
….
Strona 13 z 16
Instrukcja iteracyjna FOR
Instrukcje iteracyjne (powtarzające, zwane też pętlami) służą w językach programowania do wielokrotnego wykonywania podobnych czynności. Ogólnie dzieli się instrukcje iteracyjne na pętle o znanej lub niemożliwej do przewidzenia z góry liczbie powtórzeń. Sformułowanie "o znanej liczbie powtórzeń" wymaga pewnego wyjaśnienia. Przez znaną ilość iteracji rozumie się tu ilość znaną nie w momencie pisania programu lub pliku wsadowego, tylko ilość znaną w momencie rozpoczęcia wykonywania pętli. I tak na przykład: jeżeli pętla zostanie powtórzona tyle razy ile plików zawiera katalog bieżący, to mimo iż nie możemy przewidzieć ile plików będzie zawierał katalog traktujemy tą pętlę jako pętlę o znanej liczbie powtórzeń - liczba tą
będzie bowiem znana w momencie rozpoczynania pętli. Również omówiony wcześniej przykład
pliku wsadowego, który usuwał wszystkie pliki podane jako argumenty jest przykładem pętli o
znanej liczbie powtórzeń - plik można uruchomić z każdą liczbą argumentów, niemniej jednak
liczba ta zawsze jest znana w momencie uruchomienia pliku wsadowego.
Strona 14 z 16
A oto przykład pętli o niemożliwej do ustalenia z góry liczbie powtórzeń:
:Start
CHOICE /C:TN "Powtórzyć ?"
IF ERRORLEVEL 2 GOTO Koniec GOTO Start
:Koniec
Przerwanie pętli następuje w momencie naciśnięcia klawisza 'N' - nie można z góry przewidzieć ile razy użytkownik wybierze
odpowiedź 'T'.
Strona 15 z 16
Instrukcja iteracyjna FOR pliku wsadowego jest pętlą o znanej liczbie powtórzeń i następującej składni:
FOR %%X IN (lista) DO komenda
Argument lista jest obowiązkowy i zawiera pooddzielane znakami odstępu nazwy plików - w nazwach tych mogą występować znaki wieloznaczne '?' i '*'. Po znakach '%%' pojemy tzw.
zmienną - odpowiednik niewiadomej w matematyce. Zmienna ta będzie kolejno przybierać wszystkie możliwe wartości spośród wartości podanych na liście (lista). Dla każdej możliwej wartości zmiennej X zostanie wykonane polecenie komenda.
Rozważmy przykład:
FOR %%A IN (1 2 3) DO ECHO %%A
zmienna A przybierze (otrzyma) wartość "1" a następnie nastąpi wykonanie polecenia ECHO. Po wykonaniu komendy zmienna A otrzyma wartość "2" i ponownie nastąpi wykonanie komendy. po jej
zakończeniu zmienna A otrzyma wartość "3" i zostanie wykonana
komenda. Na tym zakończy się wykonywanie polecenia FOR.
Strona 16 z 16