Luento 4

Komentojonotiedostot

Seuraavissa luvuissa käsitellään DOS-komentojonoja. Komentojono on nimensä mukaisesti jono komentoja. Seuraavissa luvuissa käsiteltävät komentojonot eivät ole puhtaasti DOS-komentojonoja, koska "puhdasta" DOSia käytetään nykyisin hyvin vähän. Tämän vuoksi esimerkkeihin ja komentoihin on otettu mukaan Windows 2000, NT ja 95:n mukaan tuomia ominaisuuksia.

Mihin komentojonoja tarvitaan?

DOS-komentojonot olivat erityisen merkittäviä ja käyttökelpoisia DOSin ja Windows3.1:n aikaan, mutta nykyisinkin niiden avulla voidaan tehdä Windows-ympäristössä erilaisia ylläpidollisia toimia. Komentojonojen avulla on kohtuullisen helppoa toteuttaa usein toistuvia toimintoja, kuten esimerkiksi varmuuskopiointia. Komentojonojen avulla voidaan myös tehostaa erilaisia kopiointitoimia sekä ohjelmien ajamista. Ohjelmissa on paljon parametreja, joiden avulla voidaan ohjata ohjelman toimintaa. Jos ohjelmaa ajetaan usein samoilla parametreilla, niin ohjelmakutsun ja sen parametrien tekeminen komentojonoksi voi olla hyvä ratkaisu.

Miten komentojono tehdään?

Seuraavassa tutustutaan komentojonotiedoston sisältöön. Komentojonotiedosto on tavallinen ASCII-tekstitiedosto, joka nimetään päätteelle .BAT tai .CMD. Komentojonotiedosto voi sisältää tavallisia DOS-komentoja sekä ajettavien ohjelmien nimiä. Jokainen yksittäinen komentojonotiedoston rivi sisältää jonkin DOS-komennon.

Seuraavassa esimerkissä on tehty yksinkertainen komentojono, jonka avulla voidaan siirtyä ennalta määrättyyn hakemistoon ja tulostaa hakemiston sisältö ruutu kerrallaan. Komentojonon tiedot tallennetaan vaihda.bat -nimiseen tiedostoon, jonka jälkeen komentojono voidaan ajaa komennolla vaihda. Tiedoston päätettä ei tarvitse antaa, koska käyttöjärjestelmä etsii hakemistosta .com , -exe, -cmd ja .bat -päätteisiä tiedostoja oletushakemistosta. Komentojono ajetaan kirjoittamalla komentoriville komentojonon nimi ja sen vaatimat parametrit. Ajettaessa tehty komentojono täytyy olla oletushakemistossa tai PATH-polkumuuttujasta täytyy löytyä viittaus hakemistoon, jossa komentojonot sijaitsevat.

Komentojonon ensimmäisellä rivillä vaihdetaan levyasemaksi C:. Toisella rivillä vaihdetaan absoluuttista viittausta hyväksikäyttäen oletushakemistoksi C:\WINDOWS\SYSTEM\. Kolmannella rivillä tulostetaan oletushakemiston sisältö ruutu kerrallaan näytölle.

C:
CD C:\WINDOWS\SYSTEM\
DIR /P

Esimerkin komentojonosta ei ole kovinkaan paljon käytännön hyötyä, mutta se toimii hyvänä esimerkkinä toistuvien rutiinitoimien tekemisestä. Esimerkin komentojonoa pitäisi kehittää siten, että käyttäjä voisi antaa hakemiston, johon siirrytään. Käyttäjän antaman tiedon välittäminen komentojonoon vaatii parametrien käyttöä, josta enemmän seuraavassa luvussa.

Parametrien välittäminen komentojonoon

Normaalisti käyttäjän vaihtaessa hakemistoa CD-komennolla hän antaa hakemiston nimen parametrina. Esimerkiksi komennossa CD C:\HAKEMISTO\ on komentona CD ja komennon parametrina on HAKEMISTO-niminen hakemisto.

Komentojonoon parametrien välittämisessä on sama idea. Parametrien avulla käyttäjä voi muuttaa komentojonon käyttäytymistä. Edellisessä luvussa olleen esimerkin mukaisesti käyttäjä voisi haluta antaa hakemiston, johon hän haluaa siirtyä ja josta hän haluaa nähdä listauksen. Esimerkiksi käyttäjä kutsuisi komentojonoa seuraavasti:

VAIHDA C:\WINDOWS\

Tällöin komentojonon pitäisi siirtyä käyttäjän haluamaan hakemistoon eli E-levyasemalla sijaitsevaan OMAT-nimiseen hakemistoon ja antaa hakemistosta tiedostolistaus sivu kerrallaan. Seuraavassa esimerkissä komentojonon kutsussa tuleva parametri huomioidaan. Kohtaan, johon komentojonon kutsun ensimmäinen parametri halutaan tulee %1. Komentojonon suorituksen aikana %1 korvataan komentojonolle annetulla parametrilla eli C:\WINDOWS\ -hakemistoviittauksella.

C:
CD %1
DIR /P

Komentojono ei toimi kuitenkaan vielä kunnolla, koska annettaessa hakemistopolku johonkin toiseen levyasemaan esimerkiksi E:\OMAT\ näytetään C-levyaseman oletushakemiston sisältö. CD-komento vaihtaa ainoastaan kyseisen levyaseman oletushakemiston halutuksi, joten ensin täytyy tehdä levyasemalla siirtyminen. Seuraavassa esimerkissä pyritään kiertämään kyseinen ongelma välittämällä komentojonolle toinenkin parametri, jonka avulla kerrotaan levyasema, jolle siirrytään. Nyt komennolle välitetään kaksi parametria seuraavan esimerkin mukaisesti.

%0		%1		%2
VAIHDA  	E:\OMAT\  	E:

Komentojonoa täytyy muokata hieman seuraavan esimerkin muotoon. Kun komentojonoa kutsutaan edellisen esimerkin mukaisesti kahdella parametrilla, niin %2 paikalle laitetaan komentojonon toinen parametri eli E: ja %1 paikalle laitetaan komentojonon ensimmäinen parametri eli E:\OMAT\.

%2
CD %1
DIR /P

Komentojonolle voidaan antaa kaiken kaikkiaan yhdeksän eri parametria seuraavan esimerkin mukaisesti.

%0      %1      %2       %3     %4     %5     %6     %7     %8   %9
KOMENTO EKAPARA TOKAPARA KOLMAS NELJÄS VIIDES KUUDES SEISKA KASI YSI

Edellä toteutettu komentojono on toimiva, mutta ei vieläkään kovin käyttökelpoinen. Huomaa, että oikeassa komentojonossa ei saa koskaan vaihtaa oletushakemistoa, koska kaikki toimet toisiin hakemistoihin pitäisi tehdä oletushakemistosta käsin. Toisiin hakemistoihin viitattaessa kannattaa käyttää absoluuttista viittausta. Edellisten esimerkkien yksinkertaistamiseksi käytettiin CD-komentoa. Seuraavissa luvuissa tarkastellaan DOS-komentoja, joiden avulla saadaan komentojonoon lisää erilaisia ominaisuuksia.

Komentojonoissa käytettävät komennot

Komentojonoissa voidaan käyttää mitä tahansa DOS-komentoja tai ohjelmien nimiä. Seuraavissa luvuissa tutustutaan erityisesti komentojonojen yhteydessä käytettäviin DOS-komentoihin.

ECHO

ECHO-komennon avulla voidaan ohjata komentojonon tulostetta.

echo [on | off] [viesti] 

Seuraavassa esimerkissä tulostetaan näkyville teksti Hello World. Komentojonon ensimmäinen rivi kertoo, että komentojonon komentojen tulostuminen näytölle otetaan pois päältä ja ainoastaan ECHO-komennolle tulostettavat asiat tulevat käyttäjän nähtäville. @-merkki rivin alussa kertoo, että kyseistä riviä ei tulosteta näkyviin. Ilman @-merkkiä ensimmäinen rivi tulisi vielä näkyviin, mutta loput komennot eivät tule näkyviin. ECHO-komennolla voidaan tulostaa käyttäjälle haluttu informaatio näkyville. Komento ECHO. tulostaa tyhjän rivin.

@ECHO OFF
ECHO. 
ECHO Hello world!
ECHO.

REM

REM-komennolla voidaan komentojonoon liittää kommentteja, jotka eivät vaikuta komentojonon suorittamiseen.

rem [kommenttiteksti]

REM-komennolla on seuraavassa on liitetty komentojonoon informaatiota komentojonon toiminnasta.

@ECHO OFF
REM HELLO.BAT
REM Komentojono tulostaa tekstin Hello World!
ECHO. 
ECHO Hello World!
ECHO.

PAUSE

PAUSE-komennolla voidaan keskeyttää komentojonon suoritus. PAUSE-komennolla keskeytyksessä komento tulostaa tekstin "press any key to continue. . .". Komennon tulostus voidaan kuitenkin ohjata suoraan "roskikseen", kuten seuraavassa esimerkissä on tehty. PAUSE-komento antaa käyttäjälle mahdollisuuden keskeyttää komentojonon suorittaminen CTRL-C-näppäinyhdistelmällä.

Esimerkin komentojono tulostaa käyttäjälle informaatiota ja antaa mahdollisuuden keskeyttää toimintansa ennen hakemiston luomista. Jos komentojonon toimintaa ei keskeytetä CTRL-C-näppäinyhdistelmällä, niin komentojono luo hakemiston ja tulostaa sen sisällön näkyviin.

@ECHO OFF
ECHO Tehdään hakemisto %1
ECHO Keskeyttääksesi paina CTRL-C!
ECHO Muussa tapauksessa paina mitä tahansa .

PAUSE >NUL
MD %1
DIR

GOTO

GOTO-komennon avulla voidaan muuttaa komentojonon komentojen suoritusjärjestystä. Komentojonon sisällä voidaan hyppiä paikasta toiseen nimiöiden avulla. GOTO-komennolle annetaan nimiö, johon sen käsketään hypätä. Nimiö merkitään komentojonon sisälle aloittamalla rivi kaksoispisteellä (:), jonka jälkeen välittömästi annetaan nimiön nimi.

goto nimiö

Seuraavassa esimerkissä on ikuinen silmukka, joka saadaan keskeytettyä CTRL-C-näppäinyhdistelmällä. GOTO-komennolla hypätään takaisin kohtaan:alku kolmannelle riville.

@ECHO OFF

:alku 
ECHO Ikuinen silmukka :)
ECHO CTRL-C keskeyttää!!

PAUSE 
GOTO alku 

Tarkempi esimerkki GOTO-komennon käytöstä löytyy IF-komennon esimerkistä.

IF

IF-komennolla voidaan komentojonon toimintaa ehdollistaa. IF-komento on hyvin monipuolinen komento, jolla voidaan testata esimerkiksi merkkijonojen yhtä suuruutta.

if [not] merkkijono1==merkkijono2 komento 

IF-komennon avulla voidaan myös testata tiedostojen ja hakemistojen olemassaoloa. Hakemiston olemassa olon testaaminen Windows 95:ssä aiheuttaa komentoon pienen lisän. Hakemistoa täytyy testata muodossa HAKEMISTO\NUL, koska pelkällä hakemistonimellä testaaminen ei onnistu.

if [not] exist tiedostonimi komento

IF-komennolla voidaan myös testata komentojen ja ohjelmien antamia palautusarvoja.

if [not] errorlevel numero komento

Seuraavassa esimerkissä toisella rivillä testataan IF-komennolla onko komentojonolle annettu parametria. Jos parametria ei ole annettu, niin hypätään kohtaan :puuttuu ja tulostetaan käyttäjälle informaatiota asiasta. Jos parametri on annettu, niin jatketaan kolmannelle riville, jossa testataan parametrina annettavan hakemiston olemassaolo. Jos hakemisto on olemassa, niin hypätään kohtaan :virhe, jossa käyttäjälle kerrotaan tapahtuneesta. Virheen tulostamisen jälkeen tehdään uusi hyppy kohtaan :loppu, joka on komentojonon viimeinen rivi. Jos parametrina annettu hakemisto ei ollut olemassa, niin jatketaan komentojonoa riveittäin alas ja tehdään hakemisto rivillä 5. Hakemiston tekemisen jälkeen kerrotaan asiasta käyttäjälle ja hypätään komentojonon kohtaan :loppu.

@ECHO OFF 
IF "%1"=="" GOTO puuttuu
IF EXIST %1 GOTO virhe

MKDIR %1
ECHO Hakemisto %1 tehty!
GOTO loppu

:virhe
ECHO Hakemisto on jo olemassa! 
ECHO Ei voida tehdä!
GOTO loppu

:puuttuu
ECHO Et antanut parametria!
ECHO Komento on annettava muodossa:
ECHO TEEIF hakemistonimi
:loppu

EXIT

Komentojonon suoritus voidaan keskeyttää kesken suorituksen EXIT-komennolla. Jos komentojonon suoritus keskeytetään EXIT-komennolla, niin komentokehoteikkuna suljetaan esimerkiksi Windows 2000:ssa kokonaan. Tällöin käyttäjä ei saa tarvittavaa informaatiota. Edellä olleen IF-esimerkin GOTO loppu tekstien paikalla voitaisiin käyttää EXIT-komentoa.

FOR

FOR-komennon avulla voidaan käsitellä erikseen jokainen joukkona annetusta tiedostosta. Esimerkiksi jokerimerkkien avulla annettu parametri voidaan käydä läpi tiedostoittain.

for %%muuttuja in (joukko) do komento 

Seuraavassa esimerkissä käydään läpi kaikki doc ja txt -tiedostot ja tulostetaan niiden sisältö näytölle.

for %f in (*.doc *.txt) do type %f 

Seuraavassa esimerkissä tulostetaan näkyville kaikki parametrina annettujen tiedostojen sisältö. Esimerkiksi parametrina on voitu antaa *.txt, jolloin jokainen hakemistossa ollut txt-päätteinen tiedosto tulostetaan näytölle yksi kerrallaan.

for %%f in (%1) do type %%f

SHIFT

SHIFT-komento mahdollistaa komentojonoissa enemmän kuin yhdeksän parametrin käytön. SHIFT-komento siirtää kaikkia parametreja yhden taaksepäin eli %2 parametrista tulee %1 parametri.

shift 

Seuraavassa esimerkissä tuhotaan kaikki parametrina annettavat tiedostot. SHIFT-komennon käyttö mahdollistaa jokaisen parametrina annetun tiedoston tuhoamisen yksitellen. Jokaisen tiedoston tuhoamisen yhteydessä kysytään varmistus tuhoamiselle.

@ECHO OFF

:alku

IF "%1"=="" goto loppu

ECHO Tuhotaan %1
ECHO Paina jotakin näppäintä jatkaaksesi...
ECHO Painamalla CTRL-C voit keskeyttää tapahtuman!

PAUSE > NUL
DEL %1
SHIFT
GOTO alku

:loppu

CALL

CALL-komennolla voidaan kutsua komentojonon sisältä toista komentojonoa. Komentojonoa kutsuttaessa täytyy antaa komentojonon paikka ja nimi sekä komentojonoon liittyvät parametrit. call komentojonon_nimi parametrit

Ympäristömuuttujien käyttäminen

Komennolla SET voidaan tulostaa, muuttaa tai asettaa ympäristömuuttujien arvoja. Komentorivillä SET-komento näyttää kaikki määritellyt ympäristömuuttujat. Jos halutaan muuttaa jotakin olemassa olevaa ympäristömuuttujaa, niin muuttaminen tehdään seuraavan esimerkin mukaisesti. Esimerkissä PATH-ympäristömuuttuja sisältää tiedon hakemistoista, joista etsitään ajettavia ohjelmia, jollei sitä löydy oletushakemistosta. SET-komennolla PATH-ympäristömuuttujalle voidaan asettaa arvo yhtä suuruus-merkin avulla. Yhtäsuuruus merkin jälkeen annetaan %path%, jolla asetetaan arvoksi tämän hetkisen PATH-muuttujan arvo ja sen perään tulee uusi hakemisto. Hakemistojen välisenä erottimena toimii puolipiste.

set PATH=%PATH%;C:\HAKEMISTO\

Seuraavassa esimerkissä käytetään SET-komentoa ottamaan talteen parametrina tuotu arvo. Esimerkissä testataan parametrien olemassaolo ja tarvittaessa tehdään hakemisto, jonne parametrina annetut tiedostot kopioidaan. Tämän jälkeen kopioidaan jokaisen parametrin osoittama tiedosto kohdehakemistoon niin kauan kuin parametreja riittää.

@ECHO OFF

REM Testataan oliko ensimmäistä parametriä
IF "%1"=="" GOTO para

REM Testataan oliko toista parametriä
IF "%2"=="" GOTO para

REM Alustetaan kohde-niminen muuttuja
set kohde=%1

REM Testataan hekemiston olemassaoloa
IF EXIST %1 GOTO kopioi
ECHO Tehdään hakemisto %1
MD %1

:kopioi
IF "%2"=="" GOTO loppu

REM Kopioidaan tiedosto kohde-muuttujan ilmaisemaan hakemistoon
COPY %2 %kohde%
SHIFT
GOTO kopioi

:para
ECHO Et antanut riittävästi parametrejä komentojonolle!
ECHO Kutsu komentojonoa muodossa:
ECHO TEESET hakemistonimi tiedosto1 [tiedosto2 tiedosto3 .. tiedostoN]
:loppu

http://appro.mit.jyu.fi/2000/syksy/laitteistot/luennot/luento4/index.html
© Tommi Lahtonen ()<URL: http://www.iki.fi/hazor/>
3.11.2000 14:24:00