V predchádzajúcom článku venovanom Príkazovému riadku sme spomenuli konštrukciu podmieneného spracovania príkazov - príkaz IF. Tiež som uviedol ako rozhodovacie štruktúry a cykly vyzerajú v programovacom jazyku QuickBasic, ktorý bol popri Asembleri hlavným programovacím nástrojom na úsvite operačného systému MS DOS (MS je skratka pre Microsoft) a bol dodávaný k tomuto operačnému systému zadarmo.
Už spomínaný príkaz IF je možné rozšíriť pomocou kľúčového slova ELSE. Takáto rozšírená konštrukcia potom môže vyzerať nasledovným spôsobom:
if %T1%==%T2% (echo OK) else (echo Chyba)
Dôležité je, že kľúčové slovo ELSE sa musí nachádzať na tom istom riadku ako príkaz IF. Zátvorky vyznačujú blok príkazov, ktorý treba vykonať samostatne. Narozdiel od jazyku QuickBasic interpreter Príkazového riadku je veľmi primitívny a tak zápis
if %T1%==%T2% echo OK else echo Chyba
pochopí tak, že v prípade, ak sú premenné T1 a T2 rovnaké, tak vypíše text:
OK else echo Chyba
interpreter je stavaný tak, že príkaz echo jednoducho berie za svoj parameter všetky znaky až do konca riadku a tie aj vypíše. Ak premenné T1 a T2 nie sú rovnaké nevypíše nič. Pokiaľ v tom prvom zápise so zátvorkami v prípade rovnosti premenných vypíše "OK" a ak nie sú premenné rovnaké, vypíše "Chyba".
Ak sa použijú zátvorky nie je nutné, aby ELSE bolo na tom istom riadku ako IF. Teda môžem písať:
if %T1%==%T2% (
echo OK
echo Texty su rovnake
) else (
echo Chyba
echo Texty nie su rovnake
)
Príkaz IF dokáže testovať existenciu daného súboru. Tu je krátka ukážka z dávkového súboru, ktorý ma zabezpečiť inštaláciu operačného súboru FreeDOS na hardisk (ospravedlňujem sa celý dávkový súbor má približne 200 riadkov):
REM Quic and SimpleDOSBox Check ******
if not exist FDSETUP\BIN\VINFO.COM goto CantTestDOSBoxNow
FDSETUP\BIN\VINFO.COM /M
if errorlevel 102 goto CanTestDOSBoxNow
if errorlevel 101 goto SkipDriveChange
:CantTestDOSBoxNow
Zároveň možno vidieť ako sa používa systémová premenná errorlevel na odskok a oznámenie užívateľovi k akej low-level chybe došlo.
Nasledovný kód simuluje v podstatne nedokonalejšej forme konštrukciu SELECT .. CASE známu z QuickBASICU
if "%1"=="BOOT" goto SkipDriveChange
if "%1"=="CDROM" goto SkipDriveChange
Príkazový riadok pozná aj primitívnu obdobu cyklov z QuickBasicu. Žiaľ iba vo verzii s príkazom FOR. Existujú tri verzie ako sa príkaz FOR dá v príkazovom riadku použiť.
Na prácu so súbormi. Konštrukcia je nasledovná:
for %x in (sada) do prikaz
Napríklad nasledovný príkaz vypíše mená všetkých súborov v aktuálnom adresári. Teda robí to isté ako príkaz dir *.* .
for %%j in (*) do echo %%j
Pokiaľ by ste chceli tento príkaz vykonať mimo dávku, iba v príkazovom riadku, použite namiesto dvoch znakov percento, iba jeden znak percento.
Nasledovný dávkový súbor prejde všetky súbory s príponou *.txt v aktuálnom adresári, vypíše ich a skopíruje do toho istého adresára len tak, že im na začiatok mena pridá slovo kópia. Na záver vypíše počet skopírovaných súborov.
---------------- kopia.bat -------
@echo off
set p=0
for %%j in (*.txt) do (
echo %%j
copy "%%j" "kopia - %%j"
set /a p+=1
)
echo Skopirovanych %p% suborov
---------------------------------------
Premenná, ktorá sa v príkaze for nahrádza je trochu špecifická. Rozlišujú sa malé a veľké písmená. Teda %%a je iná premenná ako %%A. Je možné použiť premenné, ktorých názov pozostáva s viacerých písmen. Avšak ich celkový počet v dávkom súbore nesmie presiahnuť 52 ( POZOR OVERIŤ V OFICIÁLNEJ DOKUMENTÁCII MICROSOFTU!!!).
Nasledovný príklad ilustruje ako možno využiť príkaz FOR na prechádzanie diskami a hľadanie daného súboru v koreňovom adresári
REM Change to drive of SETUP.BAT -- Probably ****
for %%d in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do if "%0"=="%%d:setup.bat" %%d:
for %%d in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do if "%0"=="%%d:\setup.bat" %%d:
Na tieto premenné možno použiť modifikátory podobne, ako možno použiť modifikátory na parametre dávky (viď. kapitola Modifikátory parametrov).
Parameter /d hneď za príkazom for zmení jeho správanie za situácie, že sa používajú zástupné znaky.
Parameter /r spracuje aj pod-adresáre aktuálneho adresára a na každý použije príkaz for.
Parametre /d a /r možno kombinovať.
for /d %%j in (*) do echo %%j - vypíše názvy všetkých pod-adresárov aktuálneho adresára
for /r %%j in (*) do echo %%j - vypíše názvy všetkých pod-adresárov aktuálneho adresára a tiež aj všetky súbory daného adresára
for /d /r %%j in (*) do echo %%j - vyskúšajte si sami
Príkaz for s parametrom /L možno použiť k definícii klasického cyklu
for /L %%j in (1,1,10) do echo %%j - vypíše čísla 1,2,.., 10
for /L %%j in (1,2,10) do echo %%j - vypíše čísla 1,3,5,.., 9
for /L %%j in (10,-2,1) do echo %%j - vypíše čísla 10,8,..2 .
Príkaz for s parametrom /f možno využiť k vypísaniu/ analýze textového súboru. Spracovávať sa budú riadky súboru. Súbor bude rozdelený na stĺpce. Stĺpce budú oddelené tabelátorom alebo medzerami. Premenným definovaným v príkaze for budú predávané textové hodnoty jednotlivých stĺpcov. Prázdne riadky sa preskočia.
Za parametrom /f nasleduje textový reťazec, ktorý predstavuje voľby príkazu.
Predpokladajme, že máme nasledovný textový súbor:
---- data.txt ---
Novak Juraj;novak@pobox.sk;16000
#Sokol Pavol;sokol@post.sk;8000
Vrchar Alojz;vrchar@zoznam.sk;6000
Tucny Rudolf;tucny@szm.sk;9000
--------------
Dávkový súbor
------------- ludia.bat ---
@echo off
set plat=0
for /f "eol=# delims=; tokens=1,3" % %A in (data.txt) do (
echo %%A, plat: %%B Sk
set /a plat+=%%B
)
echo .
echo Celkove vydaje na zamestnancov: %plat% Sk
---------------------
Vypíše
Novak Juraj, plat: 16000 Sk
Vrchar Alojz, plat: 6000 Sk
Tucny Rudolf; plat: 9000 Sk
Celkove vydaje na zamestnancov: 31000 Sk
Komentáre
Zverejnenie komentára