CMD ja BAT - nipid ja trikid: erinevus redaktsioonide vahel

Allikas: Hinnavaatlus.ee Wiki
Mine navigeerimisribaleMine otsikasti
Rida 8: Rida 8:
 
===Sissejuhatus ja tavapärane disklaimer===
 
===Sissejuhatus ja tavapärane disklaimer===
  
*Käesolev juhend ei pretendeeri vähimalgi määral olema skritpimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema valmis skriptijuppide kogu, mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.
+
*Käesolev juhend ei pretendeeri vähimalgi määral olema skritpima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema valmis skriptijuppide kogu, mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.
  
 
*CMD ja COMMAND süntaks on erakordslt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud!  
 
*CMD ja COMMAND süntaks on erakordslt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud!  

Redaktsioon: 25. november 2005, kell 15:20


CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke

"All hope abandon, ye who enter here!"
Dante Alighieri, The Divine Comedy

Sissejuhatus ja tavapärane disklaimer

  • Käesolev juhend ei pretendeeri vähimalgi määral olema skritpima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema valmis skriptijuppide kogu, mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.
  • CMD ja COMMAND süntaks on erakordslt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud!
  • koodinäite ette paigutatud COMMAND tähendab, et antud skript on ühilduv command.com ja cmd.exe interpretaatoritega. Märge CMD tähistab ainult cmd.exe ühilduvat koodi. Märge META tähistab metasüntaksis koodi. Näidetes leiduvad foo ja bar on üldlevinud metasüntaktilised muutujad. Eesti keeli: neid võib kasutada vabalt valitavate nimega failide, muutujate, alamprotseduuride jms. tähistamiseks või metasüntaksis kirjutatud näidetes.

COMMAND.COM

MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator nimaga command.com. Command.com suhtleb kasutajaga dialoogrezhiimis (peale sisestusklahvi ENTER vajutamist täidetakse koheselt antud käsk ja väljastatakse tulemus). Command.com on UNIXist tuntud kestprogrammidega (bash, tcsh, sh, korn jne) võrreldes üsna primitiivne samuti on tema utiliitide komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, samuti pole standardsed sisend-väljundvood mõistlikult lahendatud jne.) Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. "batch" rezhiimis. Command.com interpretaatorisse ehitatud sisekäsud (näiteks DIR, COPY, DEL jne.) ja eraldi programmidena realiseeritud väliskäsud (MODE, APPEND jne.) moodustavad DOSi käsustiku. Kõiki DOSi sise ja väliskäske, samuti suvalisi käivitusfaile saab panna spetsiaalsesse skriptifaili (batch faili), mida command.com ridahaaval interpreteerib. Sellel rezhiimil täidetakse kõik käsud järjest, nii nagu nad failis on ja väljatatakse tulemused. Faili laiend peab olema .BAT, sest mingil veidral põhjuselt tavatsevad kõik Microsfti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel. Command.com on olemas ka Windows 9x seeria operatsioonisüsteemides. Command.com on 16-bitine käsuinterpretaator mis töötab real-modes v. Windowsi keskonnast käivitades virtual-real modes.

CMD.EXE

Koos täielikult 32bitise operatsioonisüsteemiga (NT 3.51) laskis Microsoft välja ka uue - 32bitise käsuinterpretaatori CMD. Kahjuks puudub mul täpsem informatsioon NT 3.51 eripärade kohta, seetõttu kehtib kõik järgnev NT4 ja uuemate (2K, XP, 2K3) kohta. CMD käsustik on command.com käskude ülemhulk. Eesti keeli: CMD oskab kõike seda mis COMMAND ja veel palju rohkem. Vahel nimetatakse CMD kasutamist ekslikult "DOSi käskudeks". See on vale, sest CMD on täisvereline 32bitine katstud rezhiimi kestprogramm - tõsi küll, harjumuspärastest Windowsi programmidest eristab teda graafilise liidese puudumine. Windows NT seeria koosseisus on olemas ka vana command.com mida jooksutatakse DOSi emulatsioonirezhiimil, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita "batch" rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.

====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata "päris" programmi kirjutama. Või soovime korduvalt teostada mõnda ülesannet mille tarbeks operatsioonisüsteemis on utiliit juba olemas, lihtsalt tema töö tuleks automatiseerida. Näiteks - mingi hosti korduv pingimine ja võrgukatkestuse korral häire saatmine. Failide massiline kopeerimine - lihtsamat sorti varundus. Suure hulga failide ümber nimetamine kindlate reeglite alusel. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea "masinakeelde", täidab ja väljastab tulemuse.

Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm
COMMAND

@ECHO OFF
ECHO Hello World

Esimene rida seab interpretaatori töörezhiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator muidu ka käsud). Teine rida väljastab teksti "Hello World". Asudes tõsisemalt skriptima, on @ECHO OFF mõtekas esialgu välja kommmenteerida, et tõrgete tekkimisel näha, millise rea täitmisel viga tekkis.
COMMAND

REM @ECHO OFF
ECHO Hello World

REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.

Nipid ja Trikid

Kuidas tekitada tühja faili

Enamasti kasutatakse selleks umbes niisugust rida:
COMMAND

echo. > foo.bar

Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus 0x0D 0x0A. Õige tulemuse annab niisugune kood:
COMMAND

copy NUL foo.bar

Nüüd saame me tõesti tühja faili. Paar sõna selgituseks: NUL on spetsiaalfail, mis oma käitub samamoodi nagu *NIX /dev/null. Tegemist on failiga kuhu võib lõpmatult andmeid saata, see fail ei saa iialgi täis, samuti ei saa sealt midagi tagasi. Omamoodi arvuti "must auk". Erinevalt looduslikust "mustast august", kust tõesti midaga tagasi ei saa on NUL natukene viisakam. Igale katsele temast midagi lugeda vastatakse viisakalt faililõpusümboliga. Ehk NUL ütleb meile: "mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni". Õnneks see ongi täpselt see mida meil vaja on.

Kataloog ehk appi ma olen eksinud

Jooksvat kataloogi säilitatakse muutujas %cd%
CMD

echo %cd%

Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi
CMD

PUSHD %SYSTEMROOT%
ECHO %CD% 
POPD

Antud näites kasutame keskkonnamuutujat %SYSTEMROOT% ehk kataloogi kuhu Windows on paigaldatud. Kasutada võib mistahes olemasolevat kataloogi C:\foo\bar. Eriti kasulikuks teeb selle käsu asjaolu, et kasutada on võimalik ka UNC kujul võrguteesid \\foo\bar\fubar mille kasutamist skriptides interpretaator ei luba (PUSHD otsib automaatselt vaba kettatähise ja monteerib selle ajutiselt külge, et skript saaks kasutada "klassikalist" teed. POPD vabastab monteeringu).
CMD

PUSHD \\foo\bar
ECHO %CD%
POPD

Rekursiivne DIR

Soovime nimekirja kõigist failidest mis asuvad puus jooksvas kataloogist allapoole (ehk kõigi failide ja alamkataloogide failide listing). Siin on võimalik ära kasutada rekursiivse kopeerimisutiliidi, xcopy, võtit /L mis faile ei kopeeri vaid väljastab ainult nimekirja failides mida ta kopeeriks.
CMD

FOR /F "tokens=1 delims=->" %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A 

For tsükkel on vajalik selleks, et xcopy väljundist kujul source -> destination eemadalda meie jaos mittevajalik "destination" osa. Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. Xcopy käsu "destinationiks" sobib MISTAHES relaaselt eksisteeriv kataloog.