Pliki Wsadowe Systemu DOS, Informatyka, DOS


Pliki wsadowe systemu DOS

Autorem opisu jest Mariusz Gerasik

1.Budowa pliku wsadowego
2. Polecenie ECHO
3.Instrukcja warunkowa (1)
4. Etykiety i instrukcja skoku GOTO
5.Argumenty plików wsadowych
6. Instrukcja warunkowa (2)
7. Instrukcja CALL

Budowa pliku wsadowego
Plik 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 ECHO
Jeż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 GOTO
Rozważ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ć:

@ECHO OFF

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...

GOTO Koniec

 

:IstniejeKopia

ECHO Plik lista.bak już istnieje...

 

:Koniec

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:
Napisać plik wsadowy mydel.bat, który usunie plik podany jako argument.

@ECHO OFF

IF EXIST %1 GOTO Usuwaj

 

ECHO Plik %1 nie istnieje...

GOTO Koniec

 

:Usuwaj

ECHO Usuwanie pliku %1 ...

DEL %1 > NUL

ECHO Wykonane...

 

:Koniec

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

albo

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ę.

@ECHO OFF

 

REM

REM Usuwa plik podany jako argument

REM

 

IF "%1" == "/?" GOTO Informacja

IF "%1" == "" GOTO BrakArgumentu

IF NOT "%2" == "" GOTO ZbytWieleArgumentow

IF EXIST %1 GOTO Usuwaj

 

ECHO Plik [%1] nie istnieje.

GOTO Koniec

 

:Usuwaj

ECHO Usuwanie [%1]

DEL %1 > NUL

GOTO Koniec

 

:BrakArgumentu

ECHO Oczekiwany argument.

GOTO Skladnia

 

:ZbytWieleArgumentow

ECHO Zbyt wiele argumentów.

GOTO Skladnia

 

:Informacja

ECHO Usuwa podany plik.

 

:Skladnia

ECHO Składnia polecenia:

ECHO   MYDEL [/?] nazwa_pliku

 

:Koniec

Mimo iż czynność jest stosunkowo prosta, to konstrukcja pliku wymaga sporego nakładu pracy. Przeanalizujemy krótko poszczególne warunki zadania.
Z przyjętych założeń wynika, że dopuszczalne są wywołania: "mydel /?", "mydel /? /?", "mydel /? lista.txt", "mydel /? lista.txt lista.bak" - dopuszczalne jest każde wywołanie, w którym pierwszy argument jest równy "/?". W związku z tym w pliku wsadowym w pierwszej kolejności sprawdzamy wystąpienie tego właśnie argumentu.
Kolejne instrukcje warunkowe dotyczą już przypadków uruchomienia bez argumentów lub z argumentami, ale z pierwszym argumentem różnym od "/?". Sprawdzamy najpierw czy podano jakikolwiek argument.
Trzecia istrukcja IF dotyczy przypadku: podano co najmniej jeden argument i argument pierwszy jest nazwą pliku. Wówczas usuwamy plik jeżeli jest to jedyny argument lub wypisujemy komunikat o błędzie gdy podano więcej niż jedną nazwę pliku. Ilość podanych argumentów, a właściwie to czy argument jest jeden, sprawdzamy porównując argument drugi %2 z napisem pustym.
Ostatnie IF dotyczy już tylko przypadku: podano dokładnie jeden argument będący nazwą pliku - pozostaje więc sprawdzić czy podany plik istnieje.

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]

Jeżeli używamy w pliku wsadowym pętli wskazane jest przedsięwzięcie pewnych środków ostrożności. Otóż wykonanie pliku wsadowego można przerwać naciskając klawisz Ctrl+C. Wówczas command.com może zareagować na naciśnięty klawisz i zakończyć wykonywanie pliku, aby jednak było to możliwe należy ustawić wykrywalność tego klawisza poleceniem:

BREAK ON

Polecenie to można wydać na klawiaturze, albo umieścić w pliku wsadowym przed rozpoczęciem pętli - najlepiej na początku pliku. Samo polecenie BREAK bez argumentu ON lub OFF wyświetla jedynie stan reakcji na klawisz Ctrl+C.
Warto pamiętać:

                               NIEOMYLNOŚĆ   =   FORMAT C:

co mniej więcej znaczy tyle, że kres wiary we własne umiejętności zawsze idzie w parze z utratą części dysku.

Zadania do samodzielnego rozwiązania

0x01 graphic

 Wszystkie pliki wsadowe powinny działać we wszystkich możliwych przypadkach związanych z istnieniem plików. Należy również zadbać o to, aby podczas wykonywania plików wyświetlane były wyłącznie informacje wypisywane przez polecenie ECHO pliku wsadowego.

  1. Napisać plik wsadowy, który zmieni nazwę pliku (np. lista.txt) na taką samą, ale z innym rozszerzeniem.

  2. Napisać plik wsadowy, który połączy dwa pliki w jeden plik o nazwie wynik.txt.

  3. Korzystając m.in. z poleceń find oraz sort napisać plik wsadowy mydir.bat, który wyświetli zawartość katalogu bieżącego. Na wydruku powinny być widoczne tylko pliki i katalogi. Wydruk powinien zawierać w pierwszej kolejności listę plików a następnie listę katalogów. Zarówno pliki jak i katalogi należy posortować alfabetycznie. Nie wolno korzystać z żadnych opcji polecenia dir, można natomiast skorzystać z tymczasowych plików pomocniczych.

  4. Napisać plik wsadowy mycopy.bat służący do tworzenia kopii pliku pod inną nazwą, przyjmując następujące założenia:

- plik działa tylko w przypadku gdy został uruchomiony z dwoma różnymi argumentami (stara_nazwa, nowa_nazwa),

- jeżeli plik o takiej nazwie jak nazwa kopii już istnieje, to nie wykonujemy kopiowania.

  1. Napisać plik wsadowy mycopy.bat służący do tworzenia kopii pliku pod inną nazwą, przyjmując następujące założenia:

- plik może być uruchomiony z dowolną ilością argumentów,

- jeżeli nie podano argumentów wypisujemy składnię,

- jeżeli pierwszy argument jest równy "/?" wypisujemy informację o przeznaczeniu i składnię,

- jeżeli podano argumenty i pierwszy z nich nie jest równy "/?" to próbujemy wykonać kopiowanie gdy podano dokładnie dwa różne argumenty, w przeciwnym wypadku (gdy podano więcej niż dwa, gdy podano jeden argument lub gdy argumenty są dwa, ale takie same) wypisujemy komunikat o błędzie,

- jeżeli plik o takiej nazwie jak nazwa kopii już istnieje, to nie wykonujemy kopiowania.

0x01 graphic

Autorem opisu jest Mariusz Gerasik,

8



Wyszukiwarka

Podobne podstrony:
Pliki wsadowe systemu DOS
Pliki wsadowe systemu MS
Pliki wsadowe dos, Uczelnia, Systemy operacyjne
dos pliki wsadowe
Informatyka, Przetwarzanie wsadowe w MS, Przetwarzanie wsadowe w MS-DOS
Budowa systemu Dos i Linux, edukacja i nauka, Informatyka
dos pliki wsadowe
Przetwarzanie Wsadowe autoexec.bat, Informatyka, DOS
Przetwarzanie wsadowe w MS-DOS, edukacja i nauka, Informatyka
Polecenia Systemu MS, Informatyka, DOS
Nakładki Ułatwiające Prace W Systemie DOS, Informatyka, DOS
dos pliki wsadowe


więcej podobnych podstron