Batch programozás
Batch programozás a neve annak a programozási eljárásnak, amelynek során a gép által végrehajtandó utasításokat nem közvetlenül gépeljük be a parancsértelmezőnek (más néven parancssor vagy angolul shell), hanem a parancsok egymásutánját egy szövegfájlban (az úgynevezett kötegeltfájl-ba ill. parancsfájlba, idegen szóval: batch-fájlba) írjuk le. Az egyes parancsfájlok (batch fájlok) az adott script nyelvben megengedett szabványos utasításból állnak. A batch fájl végrehajtása során ezeket az utasításokat a számítógép parancsértelmezője ugyanúgy hajtja végre, mintha parancssorból utasítások egymásutáni begépelésével kapta volna meg azokat.
Története
[szerkesztés]A batch programozás a kötegelt feldolgozásból fejlődött ki. A kötegelt feldolgozás abból az időből ered, amikor a számítóközpontokban a gépidő nagyon drága, illetve a konzolhoz való hozzáférés korlátozott volt (technikusok kezelték a gépet). A lefuttatandó programokat tartalmazó lyukkártyákat összekötegelték, és egyben adták át futtatásra. Ezzel optimalizálták a drága számítógépek kihasználtságát. A jól bevált ötletet megtartották, átmentették a későbbi (már nem lyukkártyás feldolgozást használó) rendszerekbe is. Fénykorát a Microsoft világban MS-DOS alatt élte, a grafikus rendszerek elterjedésével a batch programozás jelentősége erősen csökkent, napjainkra főként rendszerbeállításra és karbantartásra használatos.
Más operációs rendszerek alatt (pl. Unix, Linux) ezeket shell scripteknek hívják, és ma is fontos szerepet töltenek be az adott operációs rendszer működésével kapcsolatban. A Unix világban legelterjedtebb shell a Bourne Again Shell (Bash). Ám léteznek más shellek is, pl. tcsh, ksh, és ezek cserélhetők, sőt felváltva használhatók Unix alatt.
Előnyei
[szerkesztés]- A batch programozás eszközei minden operációs rendszeren megtalálhatók.
- Segítségével a batch fájlok időzíthetően is futtathatók, adott időpontban, napszakkal, adott gyakorisággal, stb. pl. éjszaka, amikor a rendszer terhelése kisebb.
- A batch fájlok emberi beavatkozás nélkül is futtathatók (bár lehetőség van interaktív scriptek készítésére is).
- Egy adott batch fájl bármikor újrafuttatható, így az ismétlődő feladatok mindig ugyanúgy lesznek elvégezve.
- A batch programok hívhatják egymást, így az egyes feladatokra szakosodott scriptekből elég bonyolult szituációt kezelő program is szervezhető.
- A batch programok paraméterezhetők, így az adott szituációt leíró paraméterekkel is meghívható.
- A szkript fájl emberi szemmel is olvasható.
Hátrányai
[szerkesztés]- Ismerni kell az adott gépen futó parancsértelmezőt, hogy a megfelelő programot elő tudjuk állítani. Az egyes parancsértelmezők a különböző operációs rendszereken jelentősen különbözhetnek pl. Windows parancssor v. Bash parancsértelmező Linuxon.
- Minden rendszer tartalmaz csak az adott rendszerre érvényes specifikus parancsokat. Például a könyvtárszerkezet lekérése más parancs futtatását igényli Linux vagy MS-DOS alatt.
- Az egyik gépen megírt parancsfájlok nem minden esetben vihetők át másik gépre (környezetfüggők).
- A batch fájlok szövegfájlok, emiatt bárki elolvashatja, ill. megfelelő jogosultság esetén módosíthatja őket. (Olyan esetben nem szerencsés, ha pl. el szeretnénk rejteni a felhasználó elől a program működését).
Alapok
[szerkesztés]Batch program készítésére olyan programozói editort (szövegszerkesztőt) használunk, ami nem helyez el formázóutasításokat a szövegben. A fájlba beírjuk azon utasításokat, amiket egyébként a billentyűzetről írnánk be: egy sor - egy utasítás elvet követve. Néhány rendszerben futtatási/láthatósági jogokat is hozzárendelhetünk az egyes fájlokhoz. A fájlra vonatkozó jogokkal biztosíthatjuk, hogy csak az arra illetékes személyek módosíthassák a tartalmát vagy indíthassák el a batch fájlt.
A batch fájlok kiterjesztése rendszerint .bat
, ám néhány rendszer elfogadja a .cmd
kiterjesztést is. Linux/unix rendszerek alatt az .sh
a szokásos, de valójában nem szükséges fájlkiterjesztést megadni.
Nyelvi elemek
[szerkesztés]Jelkészlet
[szerkesztés]A felhasználható karakterek kizárólag ASCII-karakterekből állhatnak. Azonosítókban, fájlok nevében tiltott karakterek: " * / : < > ? \ [ ] |
Azonosítók
[szerkesztés]Minden karaktersorozat, amely
- az angol ABC betűit, vagy számokat, _ jeleket tartalmaz, érvényes azonosító, kivéve a nyelv számára lefoglalt szavakat és a számmal kezdődő karaktersorozatokat. A kis- és nagybetűket megkülönböztetjük, bár a FAT12/FAT16 fájlrendszer a kisbetűket is nagybetűként tárolja (nem tesz különbséget).
REM jo azonositok
alma.bat
kovacs3.cmd
Foglalt szavak
[szerkesztés]Azonosító céljaira parancsnevek vagy ezek kapcsolói nem használhatók. (Például nem adhatjuk meg a belső parancsok nevét).
Címkék
[szerkesztés]Címkének (label) tekinthető minden olyan egyedi azonosító, amely kettősponttal kezdődik, nem foglalt szó, továbbá nem tartalmaz tiltott karaktereket.
Megjegyzések
[szerkesztés]A REM
szóval kezdődő sorokat a számítógép parancsértelmezője figyelmen kívül hagyja. Unix/Linux shellek használata esetén nem a REM parancsot, hanem a # (létra) karaktert kell használni és szintén csak a sor végéig érvényes.
Változók
[szerkesztés]Batch programban a változók lehetnek
- helyi változók és
- környezeti változók.
A helyi változók a felhasználó által tetszés szerint létrehozott azonosítók, melyek értékadás során jönnek létre. Értékadás a SET
paranccsal történik:
REM helyi változók
SET kiskovacs = "valaki"
SET nagykovacs = "alprogramozoseged"
REM érték törlése
SET nagykovacs = ""
A helyi változó csak az adott programban érvényes, CALL
hívással elindított másik batch program részére nem adódik át.
Helyi változóban integer (egész) aritmetika is lehetséges a SET /A
használatával:
REM helyi változók
SET /A kiss = 4500
Lebegőpontos számábrázolás és aritmetika kis trükkel lehetséges:[1]
REM Összeadandó lebegőpontos számok: 42.055 + 1.001 = 43.056
REM Egészre alakítva 42055 + 1001 = 43056
SET /A y=42055 + 1001
REM
REM Eredménye: 43056
A változók értéke rejtve marad, ha a visszhang ki van kapcsolva. A kikapcsolás az @echo off
paranccsal lehetséges. Bármely változó értékét kiírathatjuk ha százalékjelek közé tesszük:
@ECHO OFF
SET /A y=42055 + 1001
REM Eredménye: 430056, de nem írja ki, csak ha kérjük
REM kiíratjuk
ECHO %y%
REM eredménye 430056
Egy meglévő változó értékét növelhetjük, csökkenthetjük, oszthatjuk, szorozhatjuk például számlálás céljából. Példa:
REM értékadás
SET y=1000
REM növelés eggyel
SET /A y+=1
REM csökkentés eggyel
SET /A y-=1
REM osztás kettővel
SET /A y/=2
REM szorzás kettővel
SET /A y*=2
A környezeti változók tulajdonképpen olyan változók, amik a gép működésére nézve fontos információkat tartalmaznak. Ilyen környezeti változó például a PATH
, a PROMPT
, a TEMP
, stb.
A környezeti változók lehetnek
- csak olvashatók, vagy
- tetszés szerint megváltoztathatók,
- lokálisak vagy
- globálisak.
A környezeti változók közül néhány csak olvasható, ilyen például a %windir%
, amely a Windows telepítési helyét adja vissza.
Fontos, hogy ne töröljük például a PATH
környezeti változó értékét, mert enélkül még elindulni sem tud a Windows!
Egy környezeti változó lokálissá tehető az értékadás előtt kiadott SETLOCAL
paranccsal, és globálissá az
ENDLOCAL
paranccsal.
A környezeti változó értékének kiíratása a helyi változókkal megegyezik:
@ECHO OFF
REM windir környezeti változó értékének kiírása
ECHO %windir%
REM eredménye C:\WINDOWS
Külső programok futtatása
[szerkesztés]Legegyszerűbb esetben csupán a végrehajtás sorrendjében felsoroljuk a külső programokat. Néhány program azonban a helyes működéséhez paramétert vár. A paraméterek lehetnek fix kapcsolók vagy értékek, ilyenkor egyszerűen beírjuk a program neve után. Gyakoribb az az eset, hogy változó adatokkal, fájlnevekkel dolgozunk. A batch programon belül a parancssorában az átvett paraméterekre %1, %2...%9-cel hivatkozhatunk:
@echo off
rem pp.bat
rem hívása: pp valami_kiterjesztés_nélkül, pl.: pp vackor
rem
pdf2djvu -o %1.djvu %1.pdf
pause
Átirányítás
[szerkesztés]Átirányítás a > és < jelekkel lehetséges. Hatására az egyik program kimenetét a másik dolgozza fel. Legegyszerűbb esete a lemezkatalógus szövegfájlba irányítása:
@echo off
rem d.bat
rem hívása: d valami, pl.: d vackor.txt
dir /B /O /N >%1
pause
Elágazások, vezérlőszerkezetek
[szerkesztés]Egy batch programban többféle módja is lehet a feltételes végrehajtásnak:
CALL
IF [NOT] EXIST filenév parancs [parancsparaméterek]
IF [NOT] EXIST könyvtárnév\nul parancs [parancsparaméterek]
IF [NOT] ERRORLEVEL n parancs [parancsparaméterek]
IF [NOT] string1==string2 parancs [parancsparaméterek]
GOTO címke
Ciklusok
[szerkesztés]Ciklusszervezés a FOR
utasítással lehetséges. A következő példa az aktuális könyvtárban található összes C-nyelvi forrásfájlt lefordítja a cc.exe program segítségével:
rem c.bat
@echo off
for %%a in (*.c) do cc %a
Komplex példa
[szerkesztés]Telefonkönyv: három fájlunk van,
- t.bat; ez a következő kódrészlet,
- grep2.exe; egy, a grep-családból való mintakereső segédprogram, végül pedig
- tel.lst; egy szövegfájl a telefonszámokkal, l. lentebb
@echo off
rem t.bat
set ph1= Használat: t [név, vagy szám]
set ph2= Teljes lista: t x
set hdr= ==== Telefonkönyv ====
set ftr= ======================
echo.
@echo %hdr%
echo.
if "%1" == "" goto usage
if "%1" == "x" goto all
grep2 -i ^"%1" tel.lst
goto end
:all
grep2 -i [0-9] tel.lst
goto end
:usage
@echo %ph1%
@echo %ph2%
:end
echo.
@echo %ftr%
pause > nul:
set ph1=""
set ph2=""
set hdr=""
set ftr=""
exit
tel.lst
Kiss János programozó 123
Nagy Jónás alprogramozó 231
Legnagyobb János alprogramozósegéd 312
Mégnagyobb Jónás al-alprogramozósegéd 321
Ha a parancssorba beírjuk a t még
sort, eredményül Mégnagyobb Jónás nevét, beosztását és telefonszámát írja ki. Az összes adatot kiírja a t x
hatására. Végül, ha paraméter nélkül, csak a t
parancsot adjuk be, kiírja a használat módját.
Virtuális meghajtók
[szerkesztés]Virtuális meghajtókat batch programból könnyedén hozhatunk létre a SUBST
paranccsal. A következő kódrészletben
használt Tcl/Tk-ban írt program a T:
meghajtón keresi az ismeretlen verziójú Acrobat Reader olvasót. Ezáltal Tcl/Tk-ban írt programunk nem függ az Acrobat Reader verziójától és telepítési helyétől, vagyis hordozhatóvá válik. Az új gépen nem a Tcl/Tk programot fordítjuk újra, hanem az ed.cmd
fájban írjuk át az Acrobat Reader keresési útvonalát, ha esetleg szükség lenne rá.
@echo off
rem ed.cmd
subst s: l:\tked\work
subst t: "c:\Program Files\Adobe\Acrobat 7.0hu\Reader"
d:\Tcl76\bin\wish42.exe ted.tcl %1
pause
subst s: /D
subst t: /D
Eltérések
[szerkesztés]A batch programozás szempontjából legfontosabb eltéréseket ez a fejezet tartalmazza.
Az MS-DOS parancsainak listája kevesebb végrehajtható parancsot tartalmaz mint a Windows-változatokéi. Az újabb és újabb kiadású DOS-változatok egyre több utasítást tartalmaznak. Speciális batch fájl az AUTOEXEC.BAT
amely a rendszer beállításait tartalmazza.
Az összes DOS-változat minden indítási/újraindítási eljárás során először az AUTOEXEC.BAT
fájlt keresi az DOS, és ha megtalálja, akkor ezt hajtja végre. A futtatható fájlok nevei és a címkék (l. Jelkészlet c. részt) csak az angol ABC írásjeleit, számokat és aláhúzásjelet tartalmazhatják! A létrehozott batch fájl hosszára is érvényes a 8+3-as korlátozás.
A fájl kiterjesztése csak .bat
lehet.
A Windows parancsok listája lényegesen terjedelmesebb és több lehetőséget ad a programozásra.
Néhány Windows-változat még tartalmazza az autoexec.bat nevű, a rendszer indulásakor automatikusan lefutó fájlt; azonban tartalmához már nem minden esetben férhetünk hozzá.
A regisztrációs adatbázis helyettesíti.
Az XP és későbbi változatok értelmezik és végrehajtják a .bat
és a .cmd
kiterjesztésű batch fájlokat. Amennyiben az elérési út szóközt is tartalmaz, megadása esetén idézőjelbe kell tenni.
Batch fájlok windows alatti futtatása esetén több problémával is kell számolnunk
- DOS-ablak megjelenése: a batch programok felugró DOS-ablakban futtathatóak és a program lefutása után az ablak a képernyőn marad, ha a batch program nem az EXIT paranccsal végződik;
- kódlap-probléma: a DOS-ablak 852-es kódlapot használ, míg a Windows az 1250-es kódlapot. Emiatt ékezetes üzenetek megjelenítése problémát okozhat. Ha a példát vágólapra kimásolva DOS-ablakban futtatjuk, hibásan jeleníti meg az ékezetes karaktereket:
@echo off
for /f %%a in ("%date%") do set d=%%a
echo. Mai dátum : %date%
echo.d : %d%
echo.
rem Dátum feldarabolása és változókba helyezése a mezőelválasztó pont mentén
for /f "tokens=1,2,3,4 delims=." %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%d
echo.Év : %wday%
echo.Hónap : %month%
echo.Nap : %day%
pause
exit
rem Megoldás a DOS EDIT parancsa: ott kell (át)szerkeszteni...
* A Windows rendszerek érzékenyek a kis- és nagybetű közötti különbségre:
REM 3 különböző azonosító
alma.htm
Alma.htm
ALMA.HTM
- Pufferelt írás. A Windows rendszerek fájlok írásakor csak a memóriába írnak (egy átmeneti tárolót, más néven puffert használnak) a végrehajtás sebességének növelése érdekében. A tényleges lemezre írás csak akkor történik meg, ha a puffertároló megtelt, vagy a hívó batch-program befejeződött. Tehát amennyiben egy batch fájl feldolgozása során adatok kiírása történik, a kiírt adatokhoz nem lehet hozzáférni, amíg a batch-fájl nyitva van.
Windows rendszerek alatt is lehetőség van a rendszerhéj (értelmező) Unix/Linux-szerű cseréjére, melynek telepítése után a bash shell (Bourne again shell) parancsai futtathatóvá válnak.[2]
A batch programok készítésének eszközei a shell scriptek, mint pl. a Bash-ban. Jelentősen szélesebb eszköztár áll a programozó rendelkezésére, mint windows alatt. A megírt programok csak akkor futtathatók, ha a futtatási jogosultságot is beállítottuk.
Jegyzetek
[szerkesztés]Források
[szerkesztés]- Margetin István: BATCH Programozás[halott link]
- Programozás / Windows batch
- ENTERPRISE IS-DOS Felhasználói kézikönyv
- MS-DOS
- Premkumar S.: Batch File Programming
- Úry László (szerk.). IBM PC DOS programozói segédlet. Budapest: LSI (1987). ISBN 9635926618