1.Budowa pliku wsadowego 2. Polecenie ECHO3.Instrukcja warunkowa (1) 4. Etykiety i instrukcja skoku GOTO 5.Argumenty plików wsadowych6. Instrukcja warunkowa (2) 7. Instrukcja CALL
Budowa pliku wsadowegoPlik wsadowy (ang. batch file) umożliwia wykonanie dowolnego ciągu poleceń systemu MS-DOS. Z punktu widzenia systemu operacyjnego plikiem wsadowym jest każdy plik, którego nazwa posiada rozszerzenie bat.
Po wydaniu dowolnego polecenia interpreter command.com sprawdza w pierwszej kolejności czy wydana komenda jest poleceniem wewnętrznym (interpretowanym przez command.com) i w przypadku odpowiedzi pozytywnej wykonuje wydaną komendę. Jeżeli jednak interpreter nie rozpoznaje polecenia to przyjmuje, że użytkownik zarządał uruchomienia programu.Dla przykładu przyjmijmy, że wpisano komendę
sleep 10
Command.com poszukuje wówczas pliku o nazwie o nazwie sleep.com, następnie pliku sleep.exe i ostatecznie pliku sleep.bat. Po znalezieniu jednego z dwóch pierwszych zbiorów command.com uruchamia znaleziony program, w przypadku znalezienia zbioru bat wykonuje jego interpretację.
Plik wsadowy, aby mógł być poprawnie wykonany (zinterpretowany) powinien zawierać ciąg poleceń systemu, z których każde powinno być umieszczone w osobnej linii pliku. Mogą to być polecenia wewnetrzne, polecenia zewnętrzne (programy) lub polecenia specyficzne dla pliku wsadowego (polecenia, które są dozwolone tylko w tym pliku).Oto prosty przykład pliku wsadowego:
REM Plik Info.bat
ECHO Konfiguracja systemu MS-DOS
ECHO [autoexec.bat]
TYPE C:\autoexec.bat | MORE
ECHO [config.sys]
TYPE C:\config.sys | MORE
ECHO [Dysk twardy C:]
LABEL
ECHO Naciśnij jakiś klawisz...
PAUSE
Aby wykonać powyższy plik należy nadać mu nazwę z rozszerzeniem bat (może być Info.bat) a następnie w katalogu bieżącym wpisać komendę będącą nazwą pliku wsadowego, czyli odpowiednio:
C:\TEMP>info
Interpreter wykonuje sekwencyjnie jedno po drugim wszystkie polecenia pliku wsadowego w kolejności ich występowania. Pierwsza linia pliku (polecenie REM) jest komentarzem jest komentarzem i podczas wykonywania nie jest brana pod uwagę. Dwie kolejne linie zawierają polecenie ECHO, którego wykonanie polega na wypisaniu podanego tekstu na ekranie. Linie 4 i 6 zawierają polecenie MS-DOS wypisania na ekranie podanych plików (TYPE) z podziałem na strony (MORE). Linia ostatnia zawiera polecenie PAUSE, którego wykonanie polega na wypisaniu tekstu "Naciśnij jakiś klawisz, aby kontynuować..." i zatrzymaniu wykonywania pliku wsadowego do czasu naciśnięcia dowolnego klawisza.
Polecenie ECHOJeżeli wykonamy plik wsadowy test.bat zawierający tylko jedną linię z komendą DIR, to na ekranie zostaną wypisane dwie rzeczy:
C:\BATCH>test
C:\BATCH>dir
Wolumin w stacji dysków C nie ma etykiety
Numer seryjny woluminu: 364F-10E8
Katalog C:\BATCH
. <DIR> 00.08.04 20:42 .
.. <DIR> 00.08.04 20:42 ..
TEST BAT 3 00.08.04 20:43 test.bat
1 plik(ów) 3 bajtów
2 katalog(ów) 271 859 712 bajtów wolnych
C:\BATCH>_
Pierwsza linia zawiera tekst wydanej komendy. W linii drugiej interpreter wypisał treść polecenia występującego w pliku wsadowym. Kolejne linie zawierają wynik wykonanania polecenia DIR. Przykład ten pokazuje sposób postępowania podczas wykonywania pliku wsadowego - command.com czyta linię pliku wsadowego, wypisuje ją na ekranie a następnie uruchamia odpowiedni program lub polecenie wewnętrzne. Po zakończeniu wykonywania polecenia proces się powtarza - odczyta kolejną linię, wypisze jej treść na ekranie a następnie uruchomi odpowiedni program, itd.
Polecenie ECHO można wydać z argumentem ON lub OFF. Instrukcja
ECHO OFF
powoduje wyłączenie wypisywania treści poleceń występujących w pliku wsadowym. Od momentu wykonania tej instrukcji command.com nie będzie wypisywał treści przetwarzanych komend a jedynie ich wyniki. Bardzo często instrukcję powyższą umieszcza się w pierwszej linii pliku wsadowego.Użycie argumentu ON powoduje oczywiście włączenie wypisywania treści poleceń.
Z analizy wydruku dowolnego pliku wsadowego zawierającego w pierwszej linii komendę ECHO OFF można wywnioskować, że wyłączone tą komendą wypisywanie treści poleceń obowiązuje dopiero od linii drugiej - command.com zawsze wypisze treść pierwszej komendy pliku, czyli ECHO OFF. Aby tego uniknąć należy linię tą poprzedzić znakiem '@' ("at") - linia pliku, która poprzedzona jest tym znakiem nigdy nie jest wyświetlana na ekranie.
Podsumowując: istnieją dwie metody całkowitego wyłączenia wypisywania treści komend pliku wsadowego:
1. umieszczenie w pierwszej linii komendy @ECHO OFF,
2. rozpoczynanie każdej linii pliku znakiem '@'.
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
Instrukcja w tej postaci pozwala na wykonananie dowolnego polecenia tylko wówczas, gdy istnieje podany plik (lub gdy nie istnieje jeśli użyto NOT). Rozważmy dwie następujące komendy:
[1] DEL lista.txt > NUL
[2] IF EXIST lista.txt DEL lista.txt > NUL
Polecenie [1] jest oczywiste: usuń plik lista.txt. Polecenie [2] mówi: jeżeli istnieje plik lista.txt, to usuń ten plik. Efekt końcowy obu poleceń jest taki sam - zostanie usunięty plik lista.txt. Pomiędzy tymi poleceniami istnieje jednak pewna różnica; o poleceniu [2] można by powiedzieć, że "jest lepsze". Otóż polecenie DEL usuwa podany plik i nie wyświetla żadnych komunikatów o usunięciu pliku, jeżeli jednak usuwany plik nie istnieje, to wykonanie polecenia jest niemożliwe - zostanie wówczas wyświetlony komunikat o błędzie - mimo przekierowania wyjścia polecenia do pliku pustego komunikat ów pojawi się na ekranie. Taka sytuacja nie będzie miała miejsca w przypadku polecenia [2]: to polecenie bowiem wykona komendę DEL lista.txt tylko wówczas, gdy plik lista.txt istnieje - jeżeli w katalogu bieżącym pliku nie ma, to komenda jest pomijana i na tym kończy się wykonanie całej instrukcji warunkowej.
Polecenie DEL można tutaj zastąpić inną komendą, np:
[1] TYPE lista.txt
[2] IF EXIST lista.txt TYPE lista.txt
W tym wypadku mamy doczynienia z tą samą sytuacją: jeżeli nie istnieje plik lista.txt, to polecenie [1] wypisze komunikat o błędzie - nie zrobi tego natomiast polecenie [2].
Etykiety i instrukcja skoku GOTORozważymy przkład trochę trudniejszy. Należy utworzyć kopię pliku lista.txt pod nazwą lista.bak. Tutaj również wskazane jest wykorzystanie instrukcji warunkowej:
@ECHO OFF
IF EXIST lista.txt COPY lista.txt lista.bak > NUL
Jeżeli w katalogu bieżącym istnieje plik lista.txt zostanie wykonane polecenie utworzenia jego kopii pod nazwą lista.bak.Konstruując powyższy plik należy przewidzieć jeszcze jedną sytuację: w katalogu bieżącym może również istnieć plik o nazwie lista.bak. Powstaje wówczas pytanie "co w tej sytuacji zrobi polecenie COPY?" - albo wyświetli komunikat o błędzie i nie wykona kopiowania, albo też skopiuje plik źródłowy usuwając przy tym zawartość istniejącego pliku docelowego - w pewnych sytuacjach obie z tych możliwości mogą okazać się nie zadawalające.Istnieją oczywiście metody rozwiązania tego problemu za pomocą opcji polecenia COPY, warto jednak pamiętać, że opcje poleceń często zmieniają się w różnych wersjach interpretera command.com i komenda, która poprawnie wykonuje się na naszym komputerze może w innej wersji interpretera zostać uznana za niepoprawną z powodu błędnej opcji polecenia.
Powyższy przykład demonstruje problem wykonania komendy tylko wówczas, gdy spełnione są dwa lub więcej określonych warunków - problemy tego typu rozwiązuje się na ogół za pomocą instrukcji skoku GOTO.
Instrukcja:
: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
Wykonanie instrukcji skoku polega na przeniesieniu wykonywania pliku do tej linii w pliku, która zawiera (jest nazwana) podaną etykietę (wpisujemy tutaj tylko nazwę etykiety, bez znaku ':').
Wróćmy teraz do przykładu usuwania pliku:
[1] @ECHO OFF
[2] IF EXIST lista.txt GOTO Usuwaj
[3] ECHO Nie ma takiego pliku...
[4] GOTO Koniec
[5] :Usuwaj
[6] ECHO Usuwanie pliku lista.txt...
[7] DEL lista.txt > NUL
[8] ECHO Wykonane...
[9] :Koniec
W linii [2] następuje sprawdzenie istnienia w katalogu bieżącym pliku lista.txt.Jeżeli plik istnieje wykonana zostanie komenda GOTO Usuwaj - nastąpi przejście (przeniesienie wykonywania) do linii oznaczonej etykietą Usuwaj, czyli do linii [5]. Linia ta zostanie zignorowana przez command.com, który rozpocznie wykonywanie pliku od linii następnej [6]. Wypisany zostanie tekst "Usuwanie pliku lista.txt...", następnie interpreter wykona linię [7] usuwając plik lista.txt, wypisze tekst "Wykonane..." i zakończy wykonywanie pliku na ostatniej linii [9].Podczas wykonywania linii [2] może się oczywiście okazać, że katalog bieżący nie zawiera pliku lista.txt. Instrukcja warunkowa wówczas pominie podaną komendę GOTO Usuwaj i wykonana zostanie komenda następna w linii [3] - wypisanie tekstu "Nie ma takiego pliku..." oraz komenda w linii [4] - przejście do etykiety Koniec.Warto jeszcze zwrócić uwagę na linię [4]. Brak tej linii spowodowałby wypisanie tekstu "Nie ma takiego pliku..." a następnie wykonanie komendy w liniach [6], [7] i [8], czyli pomimo nieistnienia pliku byłyby wykonywane polecenia związane z jego usunięciem.
Plik wsadowy wykonujący wspomniane wcześniej kopiowanie pliku lista.txt na lista.bak mógłby mieć postać:
IF NOT EXIST lista.txt GOTO BrakPliku
IF EXIST lista.bak GOTO IstniejeKopia
ECHO Kopiowanie lista.txt na lista.bak...
COPY lista.txt lista.bak > NUL
ECHO Wykonane...
GOTO Koniec
:BrakPliku
ECHO Plik lista.txt nie istnieje...
:IstniejeKopia
ECHO Plik lista.bak już istnieje...
:Koniec
Argumenty plików wsadowychPodobnie 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:Napisać plik wsadowy mydel.bat, który usunie plik podany jako argument.
IF EXIST %1 GOTO Usuwaj
ECHO Plik %1 nie istnieje...
:Usuwaj
ECHO Usuwanie pliku %1 ...
DEL %1 > NUL
UWAGA: plik należy uruchomić z argumentem będącym nazwą pliku - jego brak może spowodować błąd wykonania i w konsekwencji komunikat o wymaganym argumencie.Interpreter podczas analizy linii pliku wszystkie wyrażenia postaci %1, %2, ..., %9 zastępuje faktycznymi argumentami podanymi w linii komend:
C:\TEMP>mydel.bat lista.txt
Usuwanie pliku lista.txt ...
Wykonane...
C:\TEMP>_
Widać powyżej, że w linii drugiej interpreter zamiast symbolu %1 wypisał faktycznie podany argument w wywołaniu lista.txt. Jeżeli plik wsadowy uruchamiamy bez argumentów to wszystkie wyrażenia %1, %2, ..., %9 są napisami pustymi (napis nie zawierający żadnych znaków). Jeżeli w linii komend występuje N argumentów, to wyrażenia %1, ..., %N reprezentują podane argumenty, wyrażenia %N+1, %N+2, ... są natomist napisami pustymi.Nasuwa się proste pytanie, czy plik wsadowy można przetworzyć z dziesięcioma lub więcej argumentami. Odpowiedź w zasadzie jest twierdząca, ale o tym nieco później...
Instrukcja warunkowa (2)Druga postać instrukcji warunkowej dotyczy porównywania napisów:
IF "napis1" == "napis2" komenda
IF NOT "napis1" == "napis2" komenda
Instrukcja w tej postaci powoduje wykonanie podanej komendy tylko wówczas, gdy oba napisy napis1 i napis2 są równe, czyli takie same. Słowo równość oznacza tutaj równość idealną - napisy musza mieć taką samą długość i składać się z takich samych znaków. W przypadku nazw plików i katalogów duże i małe litery nie są rozróżnialne, w przypadku porównywania napisów brane jest to pod uwagę. Tak więc napisy "Lista.txt" oraz "lista.txt" wcale nie są równe.
Warto pamiętać, że bezpieczniej jest podawać porównywane napisy w cudzysłowie oraz pomiędzy napisami a znakiem '=' umieścić znak odstępu - jego brak może spowodować błąd wykonania pliku.
Ta postać instrukcji warunkowej posłuży nam przede wszystkim do sprawdzania ilości podanych argumentów. Korzystając o obu postaci instrukcji możemy napisać ostateczną wersję pliku wsadowego mydel.bat usuwającego plik podany jako argument, przyjmując przy tym następujące założenia:
· plik wsadowy może być uruchomiony z argumentem '/?' - należy wówczas wyświetlić informację o przeznaczeniu oraz opis składni,
· uruchomienie pliku z jednym argumentem będącym nazwą pliku powoduje jego usunięcie lub wypisaniu komunikatu o błędzie,
· jeżeli plik został uruchomiony z dwoma lub większą ilością argumentów, to jeśli pierwszym z nich jest '/?', to wyświetlamy informację o przeznaczeniu i składnię, jeżeli natomiast pierwszy argument jest nazwą pliku, to wypisujemy komunikat o błędzie i składnię.
REM
REM Usuwa plik podany jako argument
IF "%1" == "/?" GOTO Informacja
IF "%1" == "" GOTO BrakArgumentu
IF NOT "%2" == "" GOTO ZbytWieleArgumentow
ECHO Plik [%1] nie istnieje.
ECHO Usuwanie [%1]
:BrakArgumentu
ECHO Oczekiwany argument.
...
kajoj__