Batch

W tym rozdziale chciałbym zapoznać was z komendami DOS`a i programowaniem Batch`ów. Batch`e są to skrypty powłoki systemu DOS, wystepujące w postaci nieskompilowanej w plikach o rozszerzeniach *.bat, istnieje możliwość kompilacji do plików typu *.com i *.exe, przy użyciu dodatkowych programów. Do interpretacji poleceń języka(komend) wymagany jest interpreter w postaci programu Command.com.

1.Komedny

2.Przykłady

3.Parametry i zmienne

4.Kierowanie strumieniami danych


1.Komedny i ich znaczenie

Przedstawię spis kilkudziesięciu komend przydatnych do programowaniu w batch`u, miektóre z nich są zintegrowane z systemem, a inne są osobnymi programami, jeżeli nie będziecie posiadać takiego programu to automatycznie komenda nie działa.

"Echo"-kieruje strumień danych na urządzenie (ekran, plik, drukarka), wyświetla napisy, zmienne i wyniki operacji.
Przykład:
echo Witaj w moim programie!
echo Zapiszę to do pliku > plik.txt

"Echo off" - wyłącza wypisywanie na ekranie poleceń konsoli
"Echo on" - rozpoczyna wypisywanie na ekranie poleceń konsoli
"Echo."- wyświetla pusty wiersz

"Cls"-czyści ekran

"Pause"-zatrzymuje pracę programu,aż do naciśnięcia dowolnego klawisza.

"Rem"-pozwala wprowadzać komentarz.
Przykład:
rem To jest komentarz

"Call"- uruchamia jakis plik wykonywalny (czyli *.com, *.exe, *.bat) i ewentualnie przekazuje mu parametry.
Przykład:
call pamiec.bat

"Goto"-powoduje skok do etykiety, etykieta musi mieć przed sobą dwukropek.
Przykład:
goto petla
(...treść programu...)
:petla


"Choice"-czyta znaki z klawiatury wpowadzane przez użytkownika, posiada kilka istotnych parametrów, /c - określa interesujące nas znaki, /n - nie wyświetla możliwośi wyboru, /t - określa okres czasu, po ktoreym dokonuje automatycznego wyboru, funkcję tą łączy się z komedą if w celu tworzenia warunków logicznych.
Przykład:
echo Zakończyć program?
choice /c:tn /n /t:t,3
if errorlevel 2 goto nie
if errorlevel 1 goto tak

Program pyta o swoje zakończenie, umożliwia nacisnięcia 't' lub 'n', oczekuje 3 sekund na wybór, a po upływie czasu automatycznie wybiera 't', warunki sprawdzające rozpoczyna zawsze się od ostatniej wartości, w naszym przypadku 2, ponieważ były tylko dwie możliwości.

"If" -sprawdza warunek logiczny (równość bądź nierówność) parametrów, wykorzystuje się trzy rodzaje warunków(porównanie, spawdzenie istnienia pliku i odczytanie wartości zmiennej systemowej errorlevel,przyjmuje ona różne wartości po dokonaniu każdej operacji(odczytu pliku, czytania z klawitury znaku, błędu systemu), do zaprzeczenia warunku stosujemy parametr not:
Przykład:
if  "%1"=="backup" goto backup
Skaczemy do etykiety backup jeżeli pierwszym parametrem programu jest backup, jest to porównanie parametru z tekstem
if not exist C:\Autoexec.bat goto kopiuj
Jeżeli nie istnieje plik Autoexec.bat na dysku C w katalogu głównym to skocz do etykiety kopiuj, sprawdzenie istnienia pliku
if errorlevel 2 goto drugi
Jeśli zmienna errorlevel przyjęła wartość 2 to skocz do etykiety drugi, zmienna ta może przyjąć wartość z zakresu 0 - 255, dla konkretnych informacji odsyłam do opisu zmiennych systemowych.

"Type"-wyświetla zawartość pliku do 25 lini (większa ilość lini powoduje przewijanie ekranu)

"More"-wyświetla długie pliki, po każdym pełnym ekranie czeka na klawisz aby wyświetlać dalej

"Dir"-wyświetla pliki i katalogi,komenda posida sporo parametrów, /p - zatrzymuje się po zapełnieniu ekranu, /w - używa formatu listy rozszerzonej, /v - tryb pełny (maxiumu inforamacji), /o - sortuje pliki (n-alfabetycznie,s-rozmiaru,e-rozszerzenia,d-daty,g-grupuje katalogi na początku)

Przykład:
dir /og C: Wyświetla pliki w katalogu głonym dysku C, grupując katalogi na początku

"Format"-formatuje(tzn.usuwa całą zawartość(dane), oczyszcza FAT(tablicę alokacji plików), czyści boot-sektor i inne sektory) dyski twarde i miękkie(dyskietki), umożliwia tworzenie dysku startowego - /s, format szybki(tylko usuwanie danych) - /q, pełen format - /u, określa pojemność dysku do sformatowania(np. 360KB,720KB,1,44MB czy 2,88MB) - /f:rozmiar

Przykład:
format a: /u /s /f:1.44
Przeprowadza format dyskietki w stacji a: o pojemności 1.44MB i kopiuje pliki systemowe
format b: /u /c /v:TEMP /f:360
Przeprowadza format dyskietki w stacji b: o pojemności 360KB i sprawdza klastry oznaczone jako złe oraz nadaję etykietę: TEMP
PS.Jest to jedna z ciekawszych komend, posiada także zastosowania destrukcyjne heh... heh...


"Del lub Erase"-usuwa pliki lub grupy plików, parametr /p (monituje usunięcie plików)
Przykład:
del C:\TEMP\*.*
Powoduje usunięcie(zamazanie) wszystkich plików w katalogu C:\TEMP
erase C:\GRY\*.tmp /p
Powoduje usunięcie, ale tylko potwierdzonych przez użytkownika plików o rozszerzeniach *.tmp w katalogu C:\GRY

"Deltree"-kasuje drzewo katalogów (katalogi wraz z podkatalogami i danymi)
Przykład:
deltree C:\WINDOWS\SYSTEM
Powoduje wszystkich plików i katalogów w C:\WINDOWS\SYSTEM
PS.Osobiście nie robiłbym tego ;-)

"Cd" lub "Chdir" -wchodzi do dowolnego katalogu,ale zmiana dysku odbywa się poprzez wpisanie jego "litery" z dwukropkiem
Przykład:
cd C:\DOS\UTIL
Powoduje wejście do katalogu \DOS\UTIL na dysku C
E:
Powoduje zmianę dysku na E
"Cd.."-wychodzi do poprzedniego katalogu (poziom wyżej w strukturze katalogów)
"Cd \"-wychodzi do korzenia(root`a) tj. głownego katalogu dysku

"Md" lub "Mkdir"-tworzy katalog
Przykład:
md C:\OTUL
Powoduje utworzenie pustego katalogu OTUL na dysku C

"Rd" lub "Rmdir"-usuwa pusty katalog (jeżeli katalog zawiera jakieś dane, nie zostanie usunięty)
Przykład:
rmdir D:\CHWILOWY
Powoduje usunięcie pustego katalogu CHWILOWY na dysku D

"Tree"-wyświetla strukturę katalogów w postaci drzewa, przydatna funkcja przy zmianach katalogów

"Exit"-kończy pracę aktualnego interpretera poleceń (command.com`a) i powraca do poprzedniego

"Ren"-zmienia nazwę pliku
Przykład:
ren C:\OSOBOWE\otul.txt otul.old
Powoduje zmianę nazwy pliku otul.txt na otul.old w katalogu C:\OSOBOWE

"Move"-przenosi pliki
Przykład:
move C:\KOPIE\*.txt C:\DOKUMENTY
Powoduje przeniesienie wszystkich plików textowych z katalogu C:\KOPIE do C:\DOKUMENTY

"Set"-ustwia zmienne, przypisuje im określone wartości, stringi, aby sprawdzić jakie zmienne są aktualnie uzywane wpisujemy set bez parametrów
Przykład:
set pi=3.14
Przypisuje zmiennej pi wartość 3.14

"Time"-wyświetla bieżący czas, umożliwia ustawienie nowego czasu

"Date"-wyświetla bieżącą datę, umożliwia ustawienie nowej daty

"Ver"-wyświetla wersję zainstalowanego systemu

"Vol"-wyświetla informacje o danym woluminie dysku twardego bądź miękkiego

"Label"-umożliwia nadanie etykiety dyskietkom i dyskom twardym

"Mem"-wyświetla informacje o pamięci (konwencjonalnej, górnej, EMS i XMS), ma kilka parametrów /p - zatrzymuje się po zapełnieniu ekranu, /c - wyświetla wszystkie programy rezydujące w pamięci i ilość pamięci przez nie zajmowaną, /f - wyświetla informacje o wolnej pamięci



Na razie starczy dla początkujących, znając te komendy można bez problemu napisać batch`a.

2.Przykłady

-Pisanie batch`y

Nasz pierwszy batch będzie czyścił ekran, wyświetlał komunikat, czekał na klawisz, wyświetlał pliki, tworzył katalogi i je usuwał.Nie będę pisał komentarzy, ponieważ jeżeli czytaliście dokładnie informacje wyżej zamieszczone bez trudu wszystko zrozumiecie! Aby program zadziałał musi mieć rozszerzenie *.bat,więc nadajcie mu nazwę np.Batch.bat

Można go pisać w edicie, notatniku , itp.

@echo off
cls
echo Witaj w programie Otul`a!
echo.
pause
cls
echo Cos popsujemy na komputerku
md C:\Otul
cd C:\Otul
mem > pamiec.txt
type pamiec.txt
pause
cls
del pamiec.txt
cd..
rd Otul
cls

Teraz sporządzimy bardziej przydatny program :-), będzie posiadał skromne menu i wykonywał pewne funkcje:
-czyszczenie katalogu plików tymczasowych
-robienie kopii plików *.doc z katalogu C:\MOJEDOK do katalogu C:\KOPIE\DOC
-wyświetlanie zawartości plików konfiguracyjnych AUTOEXEC.BAT i CONFIG.SYS, z obsługą błędów
Nasz program będzie posiadał prostą obsługę błędów opartą na wartościach zwracanych przez zmienną errorlevel, postaram także pokazać wam profesjonalną budowę programu, ok do roboty :-)

REM *******************************
REM Nagłówek informacyjny:
REM Program - otuljob, Wersja 1.0    
REM Autor - otul Data - 15.XI.2003
REM *******************************

-to jest przykładowy nagłówek, warto zawsze umieszczać coś takiego

:Start
@ECHO OFF
CLS
ECHO Witaj w OTULJOB wer. 1.0 
ECHO ------------------------
ECHO.
ECHO          MENU - komunikat powitalny i proste menu
ECHO.					
ECHO 1.CZYSZCZENIE PLIKOW TYMCZASOWYCH
ECHO 2.SPORZADZANIE KOPII ZAPASOWAEJ PLIKOW *.DOC
ECHO 3.WYSWIETLANIE PLIKOW KONFIGURACYJNYCH
ECHO.
ECHO K-KONIEC PORGRAMU
ECHO ____________________________________________
ECHO WYBOR:
CHOICE /C:123kK /N /T:K,30
IF ERRORLEVEL 5 GOTO Koniec
IF ERRORLEVEL 4 GOTO Koniec	
IF ERRORLEVEL 3 GOTO Wyswietl     
IF ERRORLEVEL 2 GOTO Kopia
IF ERRORLEVEL 1 GOTO Czysc

- obsługa menu poprzez warunki logiczne, zwróćcie uwagę na kolejność 
  (od najwyższego do najniższego)

:Czysc
CLS				- odczytanie zmiennej systemowej o katalogu tymczasowym
ECHO Katalog plikow tymczasowych w twoim komputerze to %temp%   
ECHO.					   
ECHO Czy napewno chcesz usunac wszystkie pliki?
CHOICE /c:tn /t:n,15
IF ERRORLEVEL 2 GOTO Start
IF ERRORLEVEL 1 ECHO T | ERASE %temp%\*.*   - potwierdzenie usunięcia plików
IF ERRORLEVEL 0 GOTO Ok  
ECHO Wystapil blad podczas uwuwania plikow!
:Ok
ECHO.
PAUSE
GOTO Start

:Kopia
SET source=C:\MOJEDOK 	- tworznie zmiennych z nazwami katalogów	    
SET target=C:\KOPIE
CLS
MD %target%           			    
IF ERRORLEVEL 0 GOTO Skip
:Blad
ECHO NIE MOZNA UTWORZYC KATALOGU
PAUSE
:Skip
ECHO.
ECHO KOPIUJE PLIKI *.DOC Z %source% do %target%:
ECHO.
COPY %source%\*.DOC %target%		   
IF ERRORLEVEL 0 GOTO Skip2
:Blad2
ECHO WYSTAPIL BLAD PODCZAS KOPIOWANIA
:Skip2
ECHO.
PAUSE
GOTO Start

:Wyswietl
CLS
IF NOT EXIST C:\AUTOEXEC.BAT GOTO Brak_autoexec	 - sprawdzanie istnienia pliku
ECHO Wyswietlam zawartosc Autoexec.bat:
ECHO.						
MORE C:\AUTOEXEC.BAT			  -wyświetlnie zawartości pliku Autoexec.bat
IF ERRORLEVEL 0 GOTO Config
:Brak_autoexec
ECHO Nie moge znalesc / odczytac pliku Autoexec.bat
ECHO.
:Config
PAUSE
CLS
IF NOT EXIST C:\CONFIG.SYS GOTO Brak_config
ECHO Wyswietlam zawartosc Config.sys:
ECHO.
MORE C:\CONFIG.SYS			-wyświetlnie zawartości pliku Autoexec.bat
IF ERRORLEVEL 0 GOTO Dalej
:Brak_config
ECHO Nie moge znalesc / odczytac pliku Autoexec.bat
ECHO.
:Dalej
PAUSE
goto Start

:Koniec
CLS
ECHO *** do zobaczenia ***		-zakończenie programu
ECHO.
PAUSE
CLS


3.Parametry i zmienne

Teraz zajmijmy się parametrami i zmiennymi:

Aby nasz skrypt mógł przyjmować parametry z zewnątrz (z linii poleceń) np. print.bat -text www.otul.prv.pl musimy w skrypcie obsłużyć parametry.

W batch`u parametry oznaczamy %x (x-cyfra) tzn. %0 - parametr nazwa programu, %1 - pierwszy parametr (tu "-text"), %2 drugi parametr (tu "www.otul.prv.pl").

Należy pamiętać że każdy parametr oddzielony jest spacją i taki wpis print -text Otul www oznacza dla skryptu %2=Otul, %3=www, także dla jednolitego tekstu należy stosować "_" zamiast spacji i jeszcze jedno batch obsługuje jednoczasowo tylko 10 parametrów. Istnieje polecenie Shift powodujące przesunięcie wszystkich parametrów w lewo, co zwalnia miejsce na następny, lecz kasuje poprzedni. Jeżeli mamy w programie trzy parametry: %0 - zawiera nazwę pliku, %1 - otul, %2 - batch, to po wykonaniu komendy Shift będzie to wyglądać następująco: %0 - otul, %1 - batch, %2 - pusty.

Wspomniałem o zmiennych, aby je wprowadzić do programu używamy polecenia set np. set autor=OTUL i od tej pory zmienna %autor% (tak piszemy w batch`u) ma wartość OTUL, ale możemy ja zmienić pisząc set autor=OtulOC, liczba zmiennych jest prawie nieograniczona. Aby wyświetlić wszystkie zmienne jakie są zadeklarowane należy wpisać Set bez parametrów.

Zmienne systemowe są to takie zmienne ,które są zadeklarowane przy starcie systemu lub zaimplementowane. Poniżej przedstawię zestaw kilkunastu zmiennych, oczywiście nie koniecznie wszystkie znajdą się w twoim komputerze :) :

errorlevel - jest to zmienna zaimplementowana w system, zawiera kod błędu po każdym wykonaniu jakieś operacji, wartość 0 oznacza że błędu ni było, jakakolwiek inna wartość wskazuje na błąd. Każda funkcja ma inny opis błędów, aby można było rozpoznać co dany błąd oznacza, należy skorzystać z jakiś tabeli, przedstawię tutaj pokrótce trzy polecenia wraz ze zwracanymi błędami.

%tmp% lub / i %temp% - zmienna deklarowana podczas startu systemu, określa katalog dla plików tymczasowych

%winbootdir% lub / i %windir% - zmienna określa katalog zainstalowania Windows`a

%blaster% / %midi% / %sound% - typowe zmienna karty muzycznej dla programów Dos`owych, określają adresy pamięci, porty, nr przerwania i katalog sterowników.

%lib% / %include% / %bin% - zmienne dla języków programowania, określają katalogi z bibliotekami funkcji, kompilatorem, linkerem, plikami pomocy itp.

Teraz powinniśmy sprawdzić to w praktyce, wykonamy odpowiedni skrypt z obsługę błędów w razie niepoprawnego parametru.

@echo off
cls
rem Odczytywanie parametrów if "%1"=="" goto brak
if "%1"=="-?" goto info
if "%1"=="-text" goto ok
rem Obsługa błedów if not "%1"=="-?" if not "%1"=="-text" goto blad

:brak
cls
echo PRINTER by OTUL
echo.
echo Brak parametrów!
echo.
echo Wpisz print -? dla uzyskania pomocy.
pause >nul
cls
exit

:info
cls
echo PRINTER by OTUL
echo.
echo Składnia:
echo.
echo print -? - wyświetla ten ekran
echo print -text jakis_tekst - wyświetla podany tekst 3-razy na ekranie
pause >nul
cls
exit

:ok
cls
echo PRINTER by OTUL
echo.
rem Przypisanie zmiennej text parametru %2
set text=%2
echo %text%
echo %text%
echo %text%
pause >nul
cls
exit

:blad
cls
echo PRINTER by OTUL
echo.
echo Wystąpił błąd!
echo.
echo Wpisz print -? dla uzyskania pomocy.
pause >nul
cls
exit




4.Kierowanie strumienia danych

W tym miejscu zajmiemy się operatorami kierowania, w batch używanymy ">", ">>", "|", "<" i "<<". Pierwsze dwa służą do kierowania wyników operacji np. do pliku lub niczego (nul) np. Chcemy zapisać ilość wolnego miejsca wraz z kilkoma informacjami o dysku C: do pliku cinfo.txt piszemy wtedy CHKDSK c > cinfo.txt , to spowoduje utworzenie nowego pliku i przepisanie do niego operacji wykonanej przez program CHKDSK. Operator kierunkowy ">>" powoduje dodanie (doklejenie) wyniku operacji już do istniejącego pliku. Jeżeli po wykonaniu powyższej komendy wpiszemy jeszcze raz CHKDSK c > cinfo.txt stary plik zostanie nadpisany. Natomiast gdy wpiszemy CHKDSK c >> cinfo.txt dodamy kolejny wynik operacji programu CHKDSK, będzie on się znajdował pod starym.

Operator "|" służy do równoległego wykorzystywanie dwóch komend (programów) np. Jeżeli chcemy zapisać informacje o pamięci komputera do pliku pamiec.txt napiszemy mem > pamiec.txt , ale gdy chcemy zapisać tylko informacje o pamięci konwencjonalnej mamy problem i wtedy przychodzi nam z pomocą operator "|", piszemy tak mem | find /I "konwencjonalna" > pamiec.txt i gotowe, w pliku znajduje się tylko linijka o pamięci konwencjonalnej.



Wszystkie przykłady oraz dodatkowy kursy znajdziecie w dziale Programy!

Batch Programming Language - FAQ dotyczący programowania w Batch`u oraz DOS`a - THEGT: (3,20 KB) Bpl.zip