.BAT

**.BAT** on tiedostopääte MS-DOS:in komentojonoille, ja tätä komentokieltä kutsutaan nimellä *Batch*. Nämä komentojonot voivat sisältää MS-DOS:in komentotulkin (Command.com), käskyjä, joista osa on ainoastaan komentojonotiedostoja varten. Command.com on korvattu Windowsissa cmd.exe:llä sekä PowerShellillä. Windowsin cmd.exe tukee Batch-komentosarjoja. Batch-komentojonot toimivat myös macOS:ssa ja Linuxissa DOSBoxin kautta. Komentojonotiedostoilla voi suorittaa peruslaskutoimituksia, mutta se ei tue liukulukuja. Myös esimerkiksi ohjelmia voi avata komentojonotiedostojen kautta. Esimerkiksi calc avaa Windowsin mukana tulevan laskimen. Jotta komentotulkki löytää halutun ohjelman, täytyy sen polun sisältyä PATH-ympäristömuuttujaan tai sitten käyttäjän täytyy vaihtaa nykyinen työhakemisto hakemistoon, jossa haluttu ohjelma sijaitsee.

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

### Esimerkkiohjelma

```dos
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:

```dos
@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*.

```dos
@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:

```dos
@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:

```dos
@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

```dos
@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:

```dos
choice /c:vastaukset kysymys
```

eli esimerkiksi:

```dos
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:

```dos
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:

```dos
set muuttuja=arvo
```


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

```dos
echo Heippa! >tiedosto.txt
```

Kirjoittaa "Heippa!" tiedostoon tiedosto.txt.

Myös kommentojen tulosten ja virheet voidaan suunnata tiedostoihin

```dos
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:

```dos
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

```dos
@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:

```dos
rem Kommentti
```


## Lähteet
*Ohjelmointiputka: MS-DOSin komentojonot