Systemy operacyjne – MS-DOS – pliki wsadowe BAT
Pliki wsadowe systemu DOS
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.
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). 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.
REM
Komenda ignorowana. Pozwala na umieszczenie komentarzy w pliku wsadowym
REM komentarz
Przerywa wykonywanie programu wsadowego do momentu naciśnięcia dowolnego klawisza. Po komendzie
można umieścić tekst wyświetlany podczas wykonywania na ekranie.
PAUSE komentarz
PAUSE > NULNie wyświetla żadnej informacji.
EXIST
Sprawdza czy dany plik lub katalog istnieje. Stosowana z IF.
IF [NOT] EXIST [plik/katalog] komenda
ZMIENNE
SET zmienna=wartość- Nadawanie zmiennej wartości
ECHO wartość: %zmienna%- Odczytywanie
IF ”%zmienna%” == ”wartość” komenda - ”ten znak powinien być ale nie zawsze musi być
-1-
Budowa pliku wsadowego
1. Polecenie ECHO
2. Instrukcja warunkowa (1)
3. Etykiety i instrukcja skoku GOTO
4. Argumenty plików wsadowych
5. Instrukcja warunkowa (2)
6. Instrukcja CALL
7. Instrukcja warunkowa (3)
8. Instrukcja iteracyjna FOR
Jeżeli wykonamy plik wsadowy a.bat zawierający tylko jedną linię z komendą DIR, to na ekranie zostanie
wypisane (rys1):
rys 1
rys 2
Pierwsza linia zawiera tekst wydanej komendy. W linii drugiej interpreter wypisał treść polecenia
występującego w pliku wsadowym. Kolejne linie zawierają wynik wykonania polecenia DIR.
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 nie
będzie wypisywana treść 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 (cmd) zawsze wypisze treść pierwszej komendy pliku, czyli ECHO OFF (rys 2). Aby
tego uniknąć należy linię tą poprzedzić znakiem '@' - 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 '@'.
-2-
ECHO ON½OFF
ECHO
ECHO tekst
ECHO.½,½/½\½+
@
@ECHO OFF
OFF powoduje że linie komend nie są wyświetlane, a jedynie ich wyniki. Domyślnie – ON, która powoduje,
że każda komenda jest wyświetlana wraz ze znakiem gotowości, a dopiero po niej efekt jej działania.
podaje aktualny stan - ON/OFF
wyświetla na ekranie podany ciąg literowy. Nie można wyświetlić znaków: <, >, |
wyświetla pustą linię
analogicznie do ECHO OFF, jednak odwołuje się tylko do linii którą poprzedza.
polecenie umieszczone zazwyczaj na początku pliku wsadowego.
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 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 lista.txt
[2] IF EXIST lista.txt DEL lista.txt
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].
Jeżeli na końcu linijki użyjemy np. \NUL lub >NUL to na ekranie nie zostanie wyświetlona np. zawartość
pliku bo wyświetlenie to zostaje przekierowane do urządzenia pustego. Podobnie jest z wyświetlaniem
informacji typu: Plików skopiowanych 1
Należy utworzyć kopię pliku lista.txt pod nazwą lista.bak. Tutaj również wskazane jest wykorzystanie
instrukcji warunkowej:
IF EXIST lista.txt COPY lista.txt lista.bak
-3-
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. Problemy tego typu rozwiązuje się na ogół za pomocą instrukcji skoku GOTO.
Powoduje skok do miejsca oznaczonego podanego etykietą. Przy poleceniu GOTO można pominąć
dwukropek poprzedzający nazwę etykiety.
GOTO etykieta
...
:etykieta
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 to miejsce w przypadku polecenia komentarza REM), instrukcji tej nie wykonuje
się, służy ona jedynie do przenoszenia wykonywania pliku przez instrukcję skoku GOTO.
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 w poprzednim opisie (Instrukcja warunkowa (1)):
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
IF EXIST lista.txt GOTO Usuwaj
ECHO Nie ma takiego pliku...
GOTO Koniec
:Usuwaj
ECHO Usuwanie pliku lista.txt...
DEL lista.txt > NUL
ECHO ...
saj5