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
![](http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Punch-card-cobol.jpg/250px-Punch-card-cobol.jpg)
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
- 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
- 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
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
Jelkészlet
A felhasználható karakterek kizárólag ASCII-karakterekből állhatnak. Azonosítókban, fájlok nevében tiltott karakterek: " * / : < > ? \ [ ] |
Azonosítók
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
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
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
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
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
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
Á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
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
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
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
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
A batch programozás szempontjából legfontosabb eltéréseket ez a fejezet tartalmazza.
DOS
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.
Windows
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
Források
- 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
Informatikai portál • összefoglaló, színes tartalomajánló lap