VI. Rendszerparancsok végrehajtása

OS/2 parancsok végrehajtása

A legegyszerûbb módja az OS/2-es parancsok végrehajtásának, ha egy az egyben beírjuk ôket a REXX programba. Lássunk egy egyszer példát:

/* d.cmd */
dir 
EXIT

A d.cmd futtatásakor a REXX megvizsgálja a dir szimbólumot. Mivel mi nem rendelünk a dir-hez értéket, az értelmezô karakterláncnak fogja tekinteni és a DIR értéket rendeli hozzá. A DIR nem kulcsutasítás és nem is címke, ezért a REXX feltételezi, hogy ez egy OS/2 program és átadja az OS/2 parancsértelmezôjének végrehajtásra, amely aztán megpróbálja lefuttatni. Az OS/2 parancsok végrehajtása közben azonban elôfordulhatnak olyan karakterek is, amelyek speciális jelentéssel bírnak a REXX-ben. Ha például a dir /w parancsot akarjuk végrehajtani, akkor a REXX a / jelet osztásnak fogja tekinteni és megpróbálja majd elosztani a dir-t a w-vel. Ez természetesen hibához fog vezetni. A megoldás az, hogy megértetjük a REXX-szel, hogy ebben az esetben egy karakterláncról van szó és nem pedig egy aritmetikai mûveletrôl. Ezt a legkönyebben úgy tehetjük meg, hogy idézôjelek közé tesszük a parancsot: 'dir /w'. Mint azt az elôzô példában is láttuk, az idézôjelekre nincs mindig szükség. A legjobb azonban, ha a rendszerparancsokat minden esetben idézôjelek közé tesszük, mivel akkor nem érhetnek kellemetlen meglepetések bennünket.

Változók és parancsok

A rendszerparancsokat természetesen kombinálhatjuk REXX változókkal is. Lássunk erre is egy példát:

vegzodes = '*.sys'
'dir 'vegzodes

A 'dir 'vegzodes szerkezet kiértékelése közben a programértelmezô behelyettesíti a vegzodes változó értékét, így az OS/2 parancsértelmezôjének már a dir *.sys parancsot fogja átadni. A változókban tárolhatunk komplett rendszerparancsokat is. A következô programrészlet például letörli az összes BAK kiterjesztésû fájlt:

delbak = 'del *.bak'
delbak

Rendszerparancsok helyettesítése REXX utasításokkal

A REXX utasítások és függvények között nagyon sok olyan van, amely a rendszerparancsokkal azonos funkcionalitású. Jó példa erre a SAY utasítás, amely ugyanazt teszi, mint az ECHO. Ha tehetjük, akkor inkább a REXX megfelelôt válasszuk, mivel a rendszerprogramok végrehajtása az OS/2 parancsértelmezôjén keresztül történik, és ez lassabb mûködést eredményez. Lássunk néhány további REXX utasítást, amelyekkel rendszerparancsokat lehet kiváltani:

1. Directory: Ezzel a cd parancs helyettesíthetô. A Directory-val ugyanakkor egy másik meghajtón lévô alkönyvtárba is válthatunk. A fuggvény által visszaadott érték az új alkönyvtár teljes elérési útvonala. Amikor a célkönyvtár nem létezik, a visszaadott érték egy üres karakterlánc. Ha paraméter nélkül hívjuk meg, akkor a jelenlegi alkönyvtárt adja vissza, így tehát a munkakönyvtár lekérdezésére is fel lehet használni.

2. Say: Ezt az utasítást már említettük, mint az ECHO megfelelôje. Ez így is van, egy esettôl eltekíntve. Az ECHO-t a visszhang ki és bekapcsolására is szokták használni (ECHO OFF/ON), erre viszont a SAY nem képes. A SAY-nek ugyanakkor nincs problémája a speciális karakterek (<, >, | stb.) megjelenítésével, ha ezek idézôjelek között állnak.

3. SetLocal/EndLocal: Ezekkel a függvényekkel a SETLOCAL és ENDLOCAL parancsok válthatók ki. A SetLocal hatására eltárolódnak a környezeti változók és a munkakönyvtár, amelyeket aztán az EndLocal-lal lehet visszaállítani. A parancsok természetesen egymásba is ágyazhatók, mint azt alábbi példaprogramunk is mutatja:

/* SetLocal/EndLocal használat */
Say 'A munkakönyvtár jelenleg: 'Directory()
CALL SetLocal
CALL Directory 'C:\OS2'
Say 'A munkakönyvtár jelenleg: 'Directory()
CALL SetLocal
Say 'A munkakönyvtár jelenleg: 'Directory('C:\OS2\APPS')
CALL EndLocal
Say 'A munkakönyvtár jelenleg: 'Directory()
CALL EndLocal
Say 'A munkakönyvtár jelenleg: 'Directory()
EXIT

A futtatás során a program elôször kiírja annak az alkönyvtárnak a nevét, ahonnan futtatjuk. Ezt követôen elraktározza a nevet és átvált a C:\OS2 alkönyvtárba. Ezt is megjegyzi és ezután átlép a C:\OS2\APPS alkönyvtárba, aminek a nevét egyben ki is írja. Az EndLocal parancsok hatására aztán visszafelé lépkedve visszatérünk a kiindulási alkönyvtárhoz. (Akinek az OS/2-je nem a C: meghajtón van, annak természetesen át kell javítani a C:-re mutató hivatkozásokat, hogy a program mûködjön.)

4. Pull: Bár a Pull utasítás nagyon sokra képes, itt most csak az OS/2-es PAUSE parancs helyettesítésére használjuk fel. Amikor begépeljük a PAUSE parancsot, akkor a Press any key when ready... üzenet jelenik meg és a további parancsok végrehajtása egészen addig szünetel, amig egy billentyût le nem ütünk. Hasonló funkcionalitást érhetünk el a Pull utasítással is:

Say 'Press ENTER when ready ...'
PULL .

Kötegprogramok (batch files) átalakítása REXX programmá

A kötegprogramokat nagyon gyorsan REXX programokká alakíthatjuk, ha az elsô sorba egy megjegyzést írunk és a parancsokat idézôjelbe tesszük. Ha ezzel kész vagyunk, akkor érdemes még néhány percet áldozni arra, hogy a programot továbbfejlesszük valódi REXX elemek beépítésével. A következô példában egy kötegfájlból konvertált REXX programot láthatunk, amely az OS/2 konfigurációs fájljairól készít három generációra kiterjedô biztonsági mentést a C:\BACKUP alkönyvtárba (most is feltételezzük, hogy az OS/2 a C: meghajtóra van telepítve és már elôzôleg létrehoztuk a BACKUP alkönyvtárat):

/* Biztonsági mentes */
'@echo off'
'c:'
'cd \backup'
'del *.??2'
'ren *.??1 *.??2'
'ren *.sys *.sy1'
'ren *.ini *.in1'
'copy c:\config.sys'
'attrib c:\os2\*.ini -R -H -S'
'copy c:\os2\os2*.ini'
'attrib *.ini -R -H -S'
EXIT

A program nagyszerûen mûködik így is, azonban van néhány dolog, amit még lehet rajta finomítani. Az egyik szépséghiba az, hogy a lefutás utás a C:\BACKUP alkönyvtárban találjuk magunkat. A Directory függvénnyel elmenthetjük a kezdôkönyvtárt, így a mentés után könnyedén vissza tudunk lépni. A könyvtárváltást is megvalósíthatjuk a Directory-val. A másik szépséghiba, hogy futtatás közben fölösleges információ (1 files (s) copied) jelenik meg a képernyôn. A feleslegesnek ítélt kimenetet átirányíthatjuk a NUL eszközre, s így már nem lesz látható. Ha elvégezzük az átalakításokat, akkor a következô programot kapjuk:

/* Biztonsági mentes 2 */

'@echo off'
toNul = '> NUL'

kezdodir = Directory() /* Itt jegyezzük meg a kezdô könyvtárt */
CALL Directory 'c:\backup' /* Egy lépésben váltunk könyvtárat */

'del *.??2' toNul
'ren *.??1 *.??2' toNul
'ren *.sys *.sy1' toNul
'ren *.ini *.in1' toNul
'copy c:\config.sys' toNul
'attrib c:\os2\*.ini -R -H -S' toNul
'copy c:\os2\os2*.ini' toNul
'attrib *.ini -R -H -S' toNul

CALL Directory kezdodir /* És itt térünk vissza */
EXIT

Visszatérési értékek

Minden program és szinte minden parancs lefutása után visszaad egy értéket, amelybôl meg lehet állapítani, hogy a futás sikeres volt-e. Sajnos a visszaadott értékekre nincsen szabály, azonban a legtöbb esetben a 0 jelenti azt, hogy minden rendben van (semmi sem ment félre, így lehet a legkönyebben megjegyezni). REXX programok esetében létezik egy automatikusan definiált változó (rc), amely mindig a legutolsó parancs vagy utasítás visszatérési értéket tárolja. Ezt a változót ugyanúgy használhatjuk, mint a többi, általunk definiált változót. Az alábbiakban egy olyan programrészletet láthatunk, amelyben egy félresikerült másolás után kiíratjuk a hibakódot:

Say 'Egy nem létezô fájlt másolunk!'
'copy szemet.txt y:\sehol'
Say 'Hibakód = 'rc

Az általunk írt REXX programok is generálnak visszatérési értékeket. Ha egyszerûen EXIT-tel zárjuk le a program futását, akkor a REXX automatikusan 0-át ad vissza. Hiba esetén 0-ától eltérô értéket is visszaadhatunk az EXIT paraméterezésével, pl. EXIT 3 . Az OS/2-es parancsértelmezô tulajdonságaiból adódóan a hibakódnak -32768 és 32768 közötti egész számnak kell lennie. Ha ezt a szabályt nem tartjuk be, akkor a REXX minden figyelmeztetés nélkül 0-át fog visszaadni.


REXX GYÍK:

K1. Mit jelent a kimenet átirányítása?
V1. A program kimenetének átirányitásával azt tudjuk befolyásolni, hogy a program hová küldje a megjelenítendô adatokat. Alapesetben a programok kimenete a képernyô. Ezt azonban átirányíthatjuk a > jellel más eszközökre, mint pl. a nyomtatóra, vagy egy fájlba. A dir > mydir átirányítással pl. a dir parancs kimenetét a mydir fájlba irányítottuk. A kimenethez hasonlóan a programok default bemeneti eszközét, a billentyûzetet is kicserélhetjük.


Gyakorlatok:

1. Alakítsuk át az alábbi batch programot REXX programmá!

@echo off
echo Tegyél be egy lemezt az A: meghajtóba!
pause
chkdsk A: /F

2. Az alábbi programban hiba van. Javítsuk ki!

/* Gyakorlat 2 */
Say 'Tedd be a formázandó lemezt az A:-ba!'
Say 'Nyomd meg az ENTERT-t ha kész vagy!'
POLL
format A: /ONCE
EXIT rc

Kádár Zsolt
1998. 01. 16.
[ Elôzô lecke | Következô lecke | Tartalom ]