msdos-dzik.pdf

(156 KB) Pobierz
32104485 UNPDF
Pliki wsadowe MS-DOS
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 zażą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 wewnętrzne, polecenia zewnętrzne (programy) lub polecenia specyficzne dla
pliku wsadowego (polecenia, które są dozwolone tylko w tym pliku).
Przykład pliku wsadowego:
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.
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.
32104485.002.png
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:
umieszczenie w pierwszej linii komendy @ECHO OFF,
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
32104485.003.png
 
IF NOT EXIST plik komenda
Instrukcja w tej postaci pozwala na wykonanie 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 plik.txt
[2] IF EXIST plik.txt DEL lista.txt
Polecenie [1] jest oczywiste: usuń plik lista.txt . Polecenie [2] mówi: jeżeli istnieje plik .txt , to
usuń ten plik. Efekt końcowy obu poleceń jest taki sam - zostanie usunięty plik plik.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
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łaczyć
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...
32104485.004.png
: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łowiu 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
wypisanie 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
32104485.001.png
Zgłoś jeśli naruszono regulamin