**.BAT** on tiedostopääte MS-DOS:in komentojonoille. Nämä komentojonot voivat sisältää MS-DOS:in komentotulkin (Command.com), käskyjä, joista osa on ainoastaan komentojonotiedostoja varten. Komentojonot toimivat myös Windowsissa komentorivin kautta, ja Mac OS:ssa ja Linuxissa DOSBoxin kautta. Komentojonotiedostoilla voi suorittaa peruslaskutoimituksia mutta ei liukulukuja. Myös esimerkiksi ohjelmia voi avata komentojonotiedostojen kautta esim. calc avaa laskimen.

Rakenne
-------

.BAT-tiedostojen rakenne on hyvin yksinkertainen. Komennot kirjoitetaan rivi kerrallaan, erotettuna rivivaihtomerkillä 0x13 tai 0x13+0x10.

### Esimerkkiohjelma

```
 echo Ensimmäinen rivi
 echo Toinen rivi
 echo Kolmas rivi

```

Yllä oleva ohjelma antaa näytöllä seuraavanlaisen tuloksen:

```
C:\>echo Ensimmäinen rivi
Ensimmäinen rivi

C:\>echo Toinen rivi
Toinen rivi

C:\>echo Kolmas rivi
Kolmas rivi
```

*Echo*-käskyä käytetään tekstirivien tulostamiseen. Tyhjä rivi tulostetaan lisäämällä komennon loppuun piste (echo.). Komentokaiutuksen tilan saa selville kirjoittamalla echo ilman parametrejä. Tulosteena on suomenkielisessä MS-DOS:issa ECHO on ON tai ECHO on OFF.

Komentokaiutus
--------------

Kuten edellisessä kappaleessa olevasta esimerkkiohjelmasta huomaa, *komentokaiutus* on oletuksellisesti päällä, eli jokainen komento näytetään ennen sen suorittamista. Jos komennon eteen kirjoitetaan @-merkki, sitä ei kaiuteta:

```
 @echo Ensimmäinen rivi
 @echo Toinen rivi
 @echo Kolmas rivi

```

Ohjelman antama tulos:

```
Ensimmäinen rivi
Toinen rivi
Kolmas rivi
```

Komentokaiutuksen voi asettaa pois päältä komennolla *echo off*.

```
 @echo off
 echo Ensimmäinen rivi
 echo Toinen rivi
 echo Kolmas rivi

```

Ehtorakenteet
-------------

Komentojonoissa ei ole varsinaisia ehtorakenteita, sillä ehtorakenteessa voi olla vain yksi käsky kerrallaan. Tämä käsky on *if*, ja sille on kolme erilaista käyttötarkoitusta:

* Merkkijonojen vertailu: if [not] merkkijono1==merkkijono käsky
* Palautusarvon (errorlevel) tarkastus: if [not] errorlevel arvo komento
* Tiedoston olemassaolon tarkastus: if [not] exist tiedosto komento

Merkkijonojen vertailussa on huomattava, että kumpikaan merkkijono ei saa olla tyhjä. *Errorlevel* tarkoittaa edellisen ohjelman palauttamaa virhekoodia. *Not* muuttaa vertailun käänteiseksi.

Hyppykäskyt
-----------

Komentojonoissa käytettävä hyppykäsky on *goto*. Sen syntaksi on goto nimi. Nimiöt määritellään koodilla :nimi. Esimerkki:

```
 @echo off
 :alku
 echo Hello World!
 goto alku

```

Ohjelma toistaa lausetta "Hello World!" loputtomiin. Ohjelmasta voi poistua kesken näppäinyhdistelmällä Ctrl+C.

### Vinkki

Monen käskyn ehtorakenteita voi luoda hyppykäskyjen avulla:

```
 @echo off
 echo Onko tiedosto.txt olemassa?
 echo.
 if not exist tiedosto.txt goto muuten
  echo -On olemassa!
  echo -On tosiaankin.
  echo -Niin muuten on.
 goto loppu
 :muuten
  echo -Ei ole olemassa!
  echo -Ei niin.
  echo -Ei tosiaankaan.
 :loppu
 echo.
 echo Ohjelma loppuu.
 pause

```

Parametrit
----------

Komentojonoja kutsuttaessa niille voidaan välittää parametrejä. Niihin viitataan ohjelmassa kirjainyhdistelmällä %parametrinnumero, eli ensimmäinen parametri on %1, toinen %2 jne. Parametrejä voi olla korkeintaan yhdeksän, ja esimerkiksi yhdistelmä %10 tarkoittaa ensimmäistä parametriä, jonka jälkeen tulee nolla.

### Esimerkki

```
 @echo off
 echo Ensimmäinen parametri on %1.
 echo Toinen parametri on %2.
 echo Kolmas parametri on %3.

```

On olemassa myös nk. nollaparametri, eli %0, josta näkyy komentojonon nimen kirjoitusasu, kun sitä kutsuttiin.

Kysymykset
----------

*Choice* -käskyä käytetään kysymyksen esittämiseen käyttäjälle. Vastaus palautetaan *errorlevel* -muuttujaan. Komennon syntaksi on seuraava:

```
 choice /c:vastaukset kysymys

```

eli esimerkiksi:

```
 choice /C:ABC Valitse A, B tai C:

```

Käyttäjä valitsee vastauksen painamalla sille määrättyä kirjainta. Errorlevel määräytyy siten, että ensimmäinen vaihtoehto on 1, toinen 2 jne.

Choice-käskylle on muitakin parametrejä, ja ne saa selville kirjoittamalla komentoriviin choice /?. Windows Vistan choicen syntaksi poikkeaa hieman vanhasta syntaksista:

```
 choice /C:ABC /M Valitse A, B tai C:

```

Muuttujat
---------

Komentojonot osaavat käsitellä DOS:in ja Windowsin ympäristömuuttujia, joihin viitataan kirjoittamalla %muuttuja%. Muuttujat voidaan asettaa komennolla *set* seuraavasti:

```
 set muuttuja=arvo

```

Tiedostoihin kirjoitus
----------------------

Tiedostoja voidaan uudelleenkirjoittaa ohjaamalla käskyjen syötteet niihin. Esimerkki:

```
 echo Heippa! >tiedosto.txt

```

Kirjoittaa "Heippa!" tiedostoon tiedosto.txt.

Myös kommentojen tulosten ja virheet voidaan suunnata tiedostoihin

```
 for /f %%i in ('dir /s /b /a-d') echo tiedosto --- %%i >>ajo.log 2>>virhelogi.log

```

Muuta
-----

### Näytön tyhjennys

*Cls*-käsky tyhjentää tiedoston tekstin, mikäli se on mahdollista. 

### Näppäimen odotus

*Pause*-käsky odottaa, kunnes painetaan jotakin näppäintä, ja tulostaa tekstin "Jatka painamalla mitä tahansa näppäintä.. .".

### >NUL

Jos käskyn loppuun lisää >NUL, sen tulosteet eivät näy. Tästä on hyötyä erityisesti pause-käskyn kanssa ja joskus myös choicen. 

**Vinkki:**

Jos tekee ohjelman .bat-muotoon, ja siinä tarvitaan Pause-käskyä, tämä kannattaa tehdä Pause-käskyn loppuun.

### For

*For*-käsky käy läpi tiedostoja ja suorittaa niille halutun komennon. Sen syntaksi on seuraava: for %%muuttuja in (tiedostojoukko) do käsky. Seuraava käsky tulostaa kaikkien nykyisen hakemiston tiedostojen nimet:

```
 for %%k in (*.*) do echo %%k

```

Uusien Windowsien komentoriveissä for-käskylle on muitakin käyttötarkoituksia. Ne saa selville kirjoittamalla komentoriviin for /?.

### Shift

Shift-käsky siirtää parametrejä yhden pykälän vasemmalle. Eli parametri, jonka numero oli ennen käskyä 2, onkin nyt parametri numero 1.

### Yhteenlasku

```
@echo off
set /a a = 2
set /a b = 10
set /a c = %a%+%b%
echo %c%

```

Kommentit
---------

Koodia voi kommentoida *rem*-"käskyllä" seuraavasti:

```
 rem Kommentti

```

Lähteet
-------

* Ohjelmointiputka: MS-DOSin komentojonot