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

 
COBOL batch program egyik utasítását tartalmazó lyukkártya

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.

Kiterjesztések szerkesztés

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.

DOS szerkesztés

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 szerkesztés

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]

UNIX/Linux rendszerek szerkesztés

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