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

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

  • 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.

Kiterjesztések

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 azonositokalma.batkovacs3.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ókSET kiskovacs = "valaki"SET nagykovacs = "alprogramozoseged"REM érték törléseSET 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ókSET /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.056REM Egészre alakítva        42055 + 1001 = 43056SET /A y=42055 + 1001REMREM 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 OFFSET /A y=42055 + 1001REM Eredménye: 430056, de nem írja ki, csak ha kérjükREM kiíratjukECHO %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ásSET y=1000REM növelés eggyelSET /A y+=1REM csökkentés eggyelSET /A y-=1REM osztás kettővelSET /A y/=2REM szorzás kettővelSET /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á azENDLOCAL paranccsal.A környezeti változó értékének kiíratása a helyi változókkal megegyezik:

@ECHO OFFREM windir környezeti változó értékének kiírásaECHO %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 offrem pp.batrem hívása: pp valami_kiterjesztés_nélkül, pl.: pp vackorrempdf2djvu -o %1.djvu %1.pdfpause

Á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 esetea lemezkatalógus szövegfájlba irányítása:

@echo offrem d.batrem hívása: d valami, pl.: d vackor.txtdir /B /O /N >%1pause

Elágazások, vezérlőszerkezetek

Egy batch programban többféle módja is lehet a feltételes végrehajtásnak:

CALLIF [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 offfor %%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 offrem t.batset ph1=  Használat: t [név, vagy szám]set ph2=  Teljes lista: t xset hdr=    ==== Telefonkönyv ====set ftr=    ======================echo.@echo %hdr%echo.if "%1" == "" goto usageif "%1" == "x" goto allgrep2 -i ^"%1" tel.lstgoto end:allgrep2 -i [0-9] tel.lstgoto end:usage@echo %ph1%@echo %ph2%:endecho.@echo %ftr%pause > nul:set ph1=""set ph2=""set hdr=""set ftr=""exittel.lstKiss János              programozó              123Nagy Jónás              alprogramozó            231Legnagyobb János        alprogramozósegéd       312Mé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észletbenhaszná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 offrem ed.cmdsubst s: l:\tked\worksubst t: "c:\Program Files\Adobe\Acrobat 7.0hu\Reader"d:\Tcl76\bin\wish42.exe ted.tcl %1pausesubst s: /Dsubst 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 offfor /f %%a in ("%date%") do set d=%%aecho. 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énfor /f "tokens=1,2,3,4 delims=." %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%decho.Év     : %wday%echo.Hónap  : %month%echo.Nap    : %day%pauseexitrem 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.htmAlma.htmALMA.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

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