V systémoch MS-DOS a Windows existuje jeden špeciálny typ súboru, ktorý nesie príponu BAT
. Stručne povedané, je to zoznam jednotlivých príkazov, ktoré sa majú postupne vykonať. Jeden riadok obsahuje jeden príkaz, ktorý sa má vykonať. Ak sa vykoná príkaz, potom sa prečíta ďalší riadok a vykoná sa.
Ukážeme si jednoduchý súbor BAT
, ktorý nás na začiatku upozorní na formátovanie diskety a potom spustí príkaz na formátovanie.
@echo off echo Formatujem disketu A: ... format a:
Náš súbor BAT obsahuje tri príkazy. Prvý príkaz @echo off
zabráni vypisovaniu jednotlivých riadkov súboru BAT na obrazovku (ak nerozumieste, skúste riadok s @echo off
vymazať a spustiť súbor znovu). Ďalši príkaz v poradí echo
vypíše na obrazovku text, ktorý sa na tomto riadku nachádza (ach chcete prázdny riadok, zadajte echo.
). A posledný príkaz je format a:
, ktorý formátuje disketu. Ak jednotlivým príkazom nerozumiete, pozrite si príkazy pre MS-DOS.
Ak ste si úspešne vyskúšali prvý súbor, môžeme ho rozšíriť o parametry. Parametry zistíme pomocou premenných %0
až %9
na otestovanie si vytvorte súbor:
@echo off @echo Zadali ste: %1 %2 %3 %4 %5 %6 %7 %8 %9
Šikovnejší z Vás si isto všimli, že v popise som písal od %0
ale v súbore parametry.bat
som začal od %1
. Urobil som to preto, lebo %0
vráti nultý parameter, teda príkaz, ktorý ste spustili. Ak nerozumiete, pripíšte si aj %0
do súboru.
Teraz si môžeme upraviť súbor formatuj.bat takto:
@echo off echo Formatujem disketu %1 ... format %1
Teraz ho môže spustiť príkazom:
formatuj a:
alebo
formatuj b:
Z jednotlivých parametrov (%0
až %9
) môžeme získať jednotlivé fragmenty cesty k súboru. Cesta môže byť napríklad C:\DOS\format.exe
.
%~d1 | Získame písmenu disku |
%~p1 | Získame adresár |
%~n1 | Získame meno súboru |
%~x1 | Získame príponu súboru |
%~z1 | Vráti veľkosť súboru |
Číslo uvedené v príkazov v tabuľke hore (1) označuje z ktorého parametru získavamé údaje a môže byť v rozpätí 0 až 9.
Ak ste si vyskúšali náš formátovací súbor, zistili ste, že nemá ošetrené chyby. Teda ak aj nezadáte parameter, bude sa tváriť, že formátuje i keď neformátuje. Toto si môžeme ošetriť podmienkou a skokmi.
Môžeme v súbore použiť 4 základné zápisi podmienky
IF "%1" == "" echo Nezadali ste parameter IF "%1" == "help" echo Potrebujete pomoc? IF EXIST "%1" echo Subor %1 existuje. IF NOT EXIST "%1" echo Subor %1 Neexistuje
Prvý riadok s príkazom IF
otestuje prvý parameter (%1
) či obsahuje nejaký text a ak neobsahuje text, spustí príkaz echo
. Druhý riadok otestuje prvý parameter (%1
) či obsahuje text help
a keď ho obsahuje, spustí príkaz echo
. V tretom riadku kontrolujeme, či súbor v príkaze %1
existuje. Ak sa nájde, potom sa vykoná príkaz (v príklade opäť echo
). Nakoniec kontrolujeme neexistenciu súboru.
Skoky sa prevádzajú pomocou príkazu goto
, ktorý skáče na návestia. Návestie je “značka” v súbore, na ktorú dokážeme “skočiť”. Nasledujúci súbor nemá žiaden praktický zmysel, iba Vám ukáže ako dokážeme skákať
@echo off echo Zacinam skakat ... goto Stred :Zaciatok echo Som na zaciatku goto Koniec :Stred echo Som v strede goto Zaciatok :Koniec echo Koncim
Ak predsa chcete používať návestia, nemusíme vytvárať návestie :Koniec
, lebo štandardne každý BAT súbor obsahuje na konci súboru návestie :EOF
. Potom by sme použili
goto EOF
.
Teraz keď už viete ako použiť podmienky a skoky, prepíšeme si náš súbor formátuj.
@echo off IF "%1" == "" goto Chyba echo Formatujem disketu %1 ... format %1 goto Koniec :Chyba echo Zabudli ste zadat parameter disku, ktory chcete formatovat. echo. echo Zadajte formatuj A: alebo formatuj B: :Koniec
Súbor máme ošetrný a teraz si popíšeme ako funguje. Na začiatku sa skontroluje, či je zadaný prvý paramter, ak nie, skočíme na návestie Chyba
ak áno, nič sa nedeje.
Namiesto skoku na návestie :Koniec
a príkazu goto Koniec
môžeme jednoducho riadok goto Koniec
nahradiť príkazom Exit
, ktorým dosiahneme ukončenie súboru BAT
.
Po formátovaní disku máme znovu skok, to preto, aby sa príkaz nevykonával ďalej a nevypísal chybu.
V systéme MS-DOS ako aj Windows existuje niekoľko premenných. Ich kompletný zoznam môžete vypísať príkazom:
set
Premenné môžeme vytvárať, mazať alebo upravovať podľa potreby. Napríklad premenná %PATH%
ukladá zoznam adresárov, kde sa hľadá súbor, ktorý spúšťate. Ak chcete spustiť napríklad scandisk
nemusíte napísať C:\DOS\scandisk
ale iba scandisk
, lebo C:\DOS
sa nachádza v premennej %PATH%
.
Sú aj špeciálne premenné, ktoré príkazom set nezistíte:
%CD% | aktuálny adresár |
%CMDLINES% | Celý riadok s príkazom, ako bol spustený |
%DATE% | Aktuálny dátum |
%TIME% | Aktuálny čas |
%RANDOM% | Náhodné číslo |
@echo off set premenna="Moje meno" echo Vase meno je %premenna%. echo Nechcete si ho zmenit? echo. set /P premenna=Zadejte meno: echo Vase nove meno je: %premenna%
Súbor mojemeno.bat
na začiatku nastaví premennú premenna na “Moje meno”, potom toto meno vypíše, požiada Vás o zmenu mena a nakoniec znovu vypíše zmenené meno.
Reťazec znakov môžete ľubovoľne skracovať podľa potreby, napríklad takto:
%premenna:~-3% | Vráti posledné 3 znaky z premennej |
%premenna:~2,6% | Vráti znaky na pozícii 2 až 6 |
%premenna:~0,-3% | Vráti celý reťazec okrem posledných 3 znakov |
Príkaz start
sa používa ak chcete spustiť program alebo skript (BAT súbor) ale nechcete čakať až na jeho skončenie. Príkazy môžete spúšťať aj bez tohto príkazu, ale potom sa bude čakať, až kým neskončia.
Dôležitošt príkazu call
spočíva v spúštaní ďalších BAT
súborov. Za normálnych okolností, akonáhle spustíte z BAT
súboru BAT
súbor, po vykonaní druhého BAT
súboru sa vykonávanie príkazov nevráti naspať do prvého. Práve preto BAT
súbory potrebujeme spušťať príkazom call
.
Niekedy potrebujeme použiť aj cykly aby sa program, alebo jeho časť niekoľko krát vykonala dookola podľa potreby.
Pozor! Premenné pre cyklus začínajú vždy dvoma %%
.
Na najjednoduchšom cykle si ukážeme ako vypísať čísla 2,4,6,8,10
@echo off for /L %%A in (2,4,6,8,10) do ( echo Cislo %%A )
Ďalší spôsob použitia cyklu je vyhľadanie všetkých EXE súborov v danom adresári:
@echo off for %%X in (*.EXE) do ( echo %%X )
Pasáž s bonusom som prebral z jedného webu asi pred 2 rokmi ale neviem ho spätne dohľadať preto ak to objaví autor, naj sa mi ozve a ho rád pripíšem
for /F "tokens=2,4 delims=; " %%M IN (cykly.txt) DO ( echo Stlpec 2: %%M Stlpec 4: %%N )
Najsilnejšie využitie cyklu for je v parsováni textových súborov. Pomocou prepínača /F dokážeme prechádzať textové súbory riadok po riadku a každy rozložiť na tzv. tokeny - časti oddelené určitými znakmi. Zadávate iba jednú premennú (M) v ktorej je uložený prvý token. Abecedne ďalšie premenné obsahujú ďalšie tokeny (N).
Ako zistiť aktuálny mesiac pomocou for:
for /F "tokens=2 delims=." %%M in ('date /T') do echo %%M
Chcete nahradiť v reťazci bodky čiarkami?
set retazec=ondrej.kamila.petra.stanislav set retazec=%retazec:.=,% echo %retazec%