Systemy operacyjne II – Laboratorium Część 1: Pliki wsadowe

Transkrypt

Systemy operacyjne II – Laboratorium Część 1: Pliki wsadowe
Uniwersytet Rzeszowski
Katedra Informatyki
Opracował: mgr inż. Przemysław Pardel v1.02 2010
Systemy operacyjne II – Laboratorium
Część 1: Pliki wsadowe – Windows
Zagadnienia do zrealizowania (3h)
Budowa pliku wsadowego .............................................................................................................. 1
Polecenie ECHO ............................................................................................................................ 2
Instrukcja warunkowa (1) .............................................................................................................. 3
Etykiety i instrukcja skoku GOTO ................................................................................................... 3
Argumenty plików wsadowych ....................................................................................................... 5
Zadania do samodzielnego rozwiązania .......................................................................................... 5
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
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ć test.bat)
a następnie w katalogu bieżącym wpisać komendę będącą nazwą pliku wsadowego, czyli
odpowiednio:
C:\TEMP>test
Interpreter wykonuje sekwencyjnie jedno po drugim wszystkie polecenia pliku wsadowego
w kolejności ich występowania. Pierwsza linia pliku (polecenie REM) 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: 367F-1EE8
Katalog C:\BATCH
.
..
TEST
<DIR>
00.09.04 20:42 .
<DIR>
00.09.04 20:42 ..
BAT
3 00.09.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 następujący przykład: 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]
[2]
[3]
[4]
@ECHO OFF
IF EXIST lista.txt GOTO Usuwaj
ECHO Nie ma takiego pliku...
GOTO Koniec
[5]
[6]
[7]
[8]
:Usuwaj
ECHO Usuwanie pliku lista.txt...
DEL lista.txt > NUL
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: plik wsadowy my_del.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.
Zadania do samodzielnego rozwiązania
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 dający użytkownikowi możliwość wylogowania lub wyłączenia komputera.
2. Napisać plik wsadowy, który zmieni nazwę pliku (np. lista.txt) na taką samą, ale z innym
rozszerzeniem.
3. Napisać plik wsadowy, który połączy dwa dowolnie wybrane pliki w jeden plik o nazwie wynik.txt.
4. Napisać plik wsadowy, który:
a. znajdzie wszystkie pliki (wypisze ich nazwy) zawierające słowo podane jako pierwszy
argument pliku wsadowego w dowolnej lokalizacji
b. znajdzie wszystkie pliki (wypisze ich nazwy) zawierające słowo podane jako pierwszy
argument pliku wsadowego w lokalizacji podanej jako drugi argument