Batch programozás

A Wikipédiából, a szabad enciklopédiából

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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

  • 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. éjszak, 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ók.

Hátrányai[szerkesztés | forrásszöveg szerkesztése]

  • 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. (Oyan esetben nem szerencsés, ha pl. el szeretnénk rejteni a felhasználó elöl a program működést).

Alapok[szerkesztés | forrásszöveg szerkesztése]

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 rendszerhez 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 | forrásszöveg szerkesztése]

A batch fájlok kiterjesztése rendszerint .bat ám néhány rendszer elfogadja a .cmd kiterjesztést is, Linux/unix rendszerek alatt pedig nem szükséges fájlkiterjesztést megadni.

Nyelvi elemek[szerkesztés | forrásszöveg szerkesztése]

Jelkészlet[szerkesztés | forrásszöveg szerkesztése]

A felhasználható karakterek kizárólag ASCII-karakterekből állhatnak. Azonosítókban, fájlok neveiben tiltott karakterek: " * / : < > ? \ [ ] |

Azonosítók[szerkesztés | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

Azonosító céljaira parancsnevek vagy ezek kapcsolói nem használhatóak (Például nem adhatjuk meg a belső parancsok neveit).

Címkék[szerkesztés | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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óak, vagy
  • tetszés szerint megváltoztathatóak,
  • 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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

Á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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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álj 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 | forrásszöveg szerkesztése]

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üsé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 | forrásszöveg szerkesztése]

A batch programozás szempontjából legfontosabb eltéréseket ez a fejezet tartalmazza.

DOS[szerkesztés | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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ű, 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 két problémával 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

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 | forrásszöveg szerkesztése]

A batch programok készítésének eszközei a shell scriptek, mint pl. a Bash. Jelentősen szélesebb eszköztár áll a programozó rendelkezésére, mint windows alatt. A megírt programok csak akkor futtathatóak, ha a futtatási jogosultágot is beállítottuk.

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

Felhasznált irodalom[szerkesztés | forrásszöveg szerkesztése]