<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="et">
	<id>http://wiki.hinnavaatlus.ee/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Offf</id>
	<title>Hinnavaatlus.ee Wiki - Kasutaja kaastööd [et]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.hinnavaatlus.ee/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Offf"/>
	<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php/Eri:Kaast%C3%B6%C3%B6/Offf"/>
	<updated>2026-05-13T04:41:35Z</updated>
	<subtitle>Kasutaja kaastööd</subtitle>
	<generator>MediaWiki 1.35.13</generator>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2893</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2893"/>
		<updated>2006-04-28T06:13:03Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Mõned rehad millega skriptima asumisel tuleks arvestada */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Lasciate ogni speranza, voi ch'entrate!&amp;quot;'' (&amp;quot;Kõik lootus jätke, astudes siit sisse!&amp;quot;)&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, &amp;quot;Jumalik komöödia&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Mõned rehad millega skriptima asumisel tuleks arvestada====&lt;br /&gt;
CMD/COMMAND väliskäskude (utiliitide) väljund on tihitpeale inkonsistentne ja pole ilma eelneva parsimiseta torudes (pipe) kasutuskõlbulik.&lt;br /&gt;
&lt;br /&gt;
Näide:&lt;br /&gt;
 date /T&lt;br /&gt;
 R 28.04.2006&lt;br /&gt;
Niisugust kuupäeva väljastuse vormingut ei ole Windowsi seadetes määratud! Seal on kuupäeva lühikese esituse vormiks 28.04.2006 ja pikaks esituseks 28. aprill 2006. a. Paraku lisab &amp;lt;tt&amp;gt;DATE&amp;lt;/tt&amp;gt; utiliit väljundisse &amp;quot;omaenese tarkusest&amp;quot; nädalapäeva.&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada ajutist faili===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale on keerukamate ülesannete implmenteerimiseks CMD skripti abil vaja kasutada ajutisi faile. Kuidas seesuguseid viisakalt tekitada.&amp;lt;br&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 :DO&lt;br /&gt;
 SET myrndtmp=%TEMP%\%RANDOM%.tmp&lt;br /&gt;
 IF EXIST %myrndtmp% GOTO DO &lt;br /&gt;
 COPY NUL %myrndtmp%&lt;br /&gt;
 IF ERRORLEVEL 1 EXIT /B&lt;br /&gt;
 &lt;br /&gt;
 :: Teeme midagi kasulikku &lt;br /&gt;
 ECHO foo &amp;gt; %myrndtmp%&lt;br /&gt;
 TYPE %myrndtmp%&lt;br /&gt;
 &lt;br /&gt;
 DEL /Y %myrndtmp%&lt;br /&gt;
Mis meil siin siis toimub? Esiteks seatakse ajutise faili täisnimi (faili nimi koos täieliku teega). Selleks kysitakse süsteemilt ajutiste failide hoidmiseks määratud kataloogi &amp;lt;tt&amp;gt;%TEMP%&amp;lt;/tt&amp;gt; ning juhuslikku arvu vahemikus 0..32767 (&amp;lt;tt&amp;gt;%RANDOM%&amp;lt;/tt&amp;gt;). Kontrollitakse ega niisugune fail juba ei eksisteeri. Kui juhtub, et niisuguse nimega fail on juba olemas küsitakse uus juhuslik failinimi. Tegevust korratakse seni kuni leitakse &amp;quot;vaba&amp;quot; nimi. Vaba nimi käes, kasutatakse eelmises näites toodud võtet tühja faili loomiseks. Lõpuks kontrollitakse kas faili loomine oli edukas. Kui &amp;lt;tt&amp;gt;COPY&amp;lt;/tt&amp;gt; käsu täitmine mingil põhjusel ebaõnnestus (ketas täis, puudub kirjutusõigus, vigaselt määratud keskkond jms.) katkestatakse koodi täitmine (&amp;lt;tt&amp;gt;EXIT /B&amp;lt;/tt&amp;gt;). Kui töö tehtud, siis on viisakas ajutused failid enda järelt kustutada.&lt;br /&gt;
Paneme tähele, et me ei tea, MIS nimega meile ajutine fail luuakse ja KUHU see täpselt pannakse, aga meie seisukohast pole see absoluutselt oluline, kuna meie jaoks on faili täisnimi alati saadavalt muutujas &amp;lt;tt&amp;gt;%myrndtmp%&amp;lt;/tt&amp;gt; ja sellisel kujul kasutatav.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; väärtusest &amp;quot;[tühik]proov[tühik]&amp;quot; uueks väärtuseks &amp;quot;proov&amp;quot;.&lt;br /&gt;
Kõik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;quot; see on proov &amp;quot;, siis uus väärtus &amp;quot;seeonproov&amp;quot; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese märgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2892</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2892"/>
		<updated>2006-04-28T06:05:41Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Sissejuhatus ja tavapärane disklaimer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Lasciate ogni speranza, voi ch'entrate!&amp;quot;'' (&amp;quot;Kõik lootus jätke, astudes siit sisse!&amp;quot;)&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, &amp;quot;Jumalik komöödia&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Mõned rehad millega skriptima asumisel tuleks arvestada====&lt;br /&gt;
CMD/COMMAND väliskäskude (utiliitide) väljund on tihitpeale inkonsistentne ja pole ilma eelneva parsimiseta torudes (pipe) kasutuskõlbulik.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada ajutist faili===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale on keerukamate ülesannete implmenteerimiseks CMD skripti abil vaja kasutada ajutisi faile. Kuidas seesuguseid viisakalt tekitada.&amp;lt;br&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 :DO&lt;br /&gt;
 SET myrndtmp=%TEMP%\%RANDOM%.tmp&lt;br /&gt;
 IF EXIST %myrndtmp% GOTO DO &lt;br /&gt;
 COPY NUL %myrndtmp%&lt;br /&gt;
 IF ERRORLEVEL 1 EXIT /B&lt;br /&gt;
 &lt;br /&gt;
 :: Teeme midagi kasulikku &lt;br /&gt;
 ECHO foo &amp;gt; %myrndtmp%&lt;br /&gt;
 TYPE %myrndtmp%&lt;br /&gt;
 &lt;br /&gt;
 DEL /Y %myrndtmp%&lt;br /&gt;
Mis meil siin siis toimub? Esiteks seatakse ajutise faili täisnimi (faili nimi koos täieliku teega). Selleks kysitakse süsteemilt ajutiste failide hoidmiseks määratud kataloogi &amp;lt;tt&amp;gt;%TEMP%&amp;lt;/tt&amp;gt; ning juhuslikku arvu vahemikus 0..32767 (&amp;lt;tt&amp;gt;%RANDOM%&amp;lt;/tt&amp;gt;). Kontrollitakse ega niisugune fail juba ei eksisteeri. Kui juhtub, et niisuguse nimega fail on juba olemas küsitakse uus juhuslik failinimi. Tegevust korratakse seni kuni leitakse &amp;quot;vaba&amp;quot; nimi. Vaba nimi käes, kasutatakse eelmises näites toodud võtet tühja faili loomiseks. Lõpuks kontrollitakse kas faili loomine oli edukas. Kui &amp;lt;tt&amp;gt;COPY&amp;lt;/tt&amp;gt; käsu täitmine mingil põhjusel ebaõnnestus (ketas täis, puudub kirjutusõigus, vigaselt määratud keskkond jms.) katkestatakse koodi täitmine (&amp;lt;tt&amp;gt;EXIT /B&amp;lt;/tt&amp;gt;). Kui töö tehtud, siis on viisakas ajutused failid enda järelt kustutada.&lt;br /&gt;
Paneme tähele, et me ei tea, MIS nimega meile ajutine fail luuakse ja KUHU see täpselt pannakse, aga meie seisukohast pole see absoluutselt oluline, kuna meie jaoks on faili täisnimi alati saadavalt muutujas &amp;lt;tt&amp;gt;%myrndtmp%&amp;lt;/tt&amp;gt; ja sellisel kujul kasutatav.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; väärtusest &amp;quot;[tühik]proov[tühik]&amp;quot; uueks väärtuseks &amp;quot;proov&amp;quot;.&lt;br /&gt;
Kõik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;quot; see on proov &amp;quot;, siis uus väärtus &amp;quot;seeonproov&amp;quot; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese märgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2740</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2740"/>
		<updated>2006-01-12T09:45:49Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Tühikute eemaldamine sõne algusest ja lõpust */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada ajutist faili===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale on keerukamate ülesannete implmenteerimiseks CMD skripti abil vaja kasutada ajutisi faile. Kuidas seesuguseid viisakalt tekitada.&amp;lt;br&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 :DO&lt;br /&gt;
 SET myrndtmp=%TEMP%\%RANDOM%.tmp&lt;br /&gt;
 IF EXIST %myrndtmp% GOTO DO &lt;br /&gt;
 COPY NUL %myrndtmp%&lt;br /&gt;
 IF ERRORLEVEL 1 EXIT /B&lt;br /&gt;
 &lt;br /&gt;
 :: Teeme midagi kasulikku &lt;br /&gt;
 ECHO foo &amp;gt; %myrndtmp%&lt;br /&gt;
 TYPE %myrndtmp%&lt;br /&gt;
 &lt;br /&gt;
 DEL /Y %myrndtmp%&lt;br /&gt;
Mis meil siin siis toimub? Esiteks seatakse ajutise faili täisnimi (faili nimi koos täieliku teega). Selleks kysitakse süsteemilt ajutiste failide hoidmiseks määratud kataloogi &amp;lt;tt&amp;gt;%TEMP%&amp;lt;/tt&amp;gt; ning juhuslikku arvu vahemikus 0..32767 (&amp;lt;tt&amp;gt;%RANDOM%&amp;lt;/tt&amp;gt;). Kontrollitakse ega niisugune fail juba ei eksisteeri. Kui juhtub, et niisuguse nimega fail on juba olemas küsitakse uus juhuslik failinimi. Tegevust korratakse seni kuni leitakse &amp;quot;vaba&amp;quot; nimi. Vaba nimi käes, kasutatakse eelmises näites toodud võtet tühja faili loomiseks. Lõpuks kontrollitakse kas faili loomine oli edukas. Kui &amp;lt;tt&amp;gt;COPY&amp;lt;/tt&amp;gt; käsu täitmine mingil põhjusel ebaõnnestus (ketas täis, puudub kirjutusõigus, vigaselt määratud keskkond jms.) katkestatakse koodi täitmine (&amp;lt;tt&amp;gt;EXIT /B&amp;lt;/tt&amp;gt;). Kui töö tehtud, siis on viisakas ajutused failid enda järelt kustutada.&lt;br /&gt;
Paneme tähele, et me ei tea, MIS nimega meile ajutine fail luuakse ja KUHU see täpselt pannakse, aga meie seisukohast pole see absoluutselt oluline, kuna meie jaoks on faili täisnimi alati saadavalt muutujas &amp;lt;tt&amp;gt;%myrndtmp%&amp;lt;/tt&amp;gt; ja sellisel kujul kasutatav.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; väärtusest &amp;quot;[tühik]proov[tühik]&amp;quot; uueks väärtuseks &amp;quot;proov&amp;quot;.&lt;br /&gt;
Kõik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;quot; see on proov &amp;quot;, siis uus väärtus &amp;quot;seeonproov&amp;quot; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese märgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2739</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2739"/>
		<updated>2006-01-12T09:43:21Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Kuidas tekitada ajutist faili */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada ajutist faili===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale on keerukamate ülesannete implmenteerimiseks CMD skripti abil vaja kasutada ajutisi faile. Kuidas seesuguseid viisakalt tekitada.&amp;lt;br&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 :DO&lt;br /&gt;
 SET myrndtmp=%TEMP%\%RANDOM%.tmp&lt;br /&gt;
 IF EXIST %myrndtmp% GOTO DO &lt;br /&gt;
 COPY NUL %myrndtmp%&lt;br /&gt;
 IF ERRORLEVEL 1 EXIT /B&lt;br /&gt;
 &lt;br /&gt;
 :: Teeme midagi kasulikku &lt;br /&gt;
 ECHO foo &amp;gt; %myrndtmp%&lt;br /&gt;
 TYPE %myrndtmp%&lt;br /&gt;
 &lt;br /&gt;
 DEL /Y %myrndtmp%&lt;br /&gt;
Mis meil siin siis toimub? Esiteks seatakse ajutise faili täisnimi (faili nimi koos täieliku teega). Selleks kysitakse süsteemilt ajutiste failide hoidmiseks määratud kataloogi &amp;lt;tt&amp;gt;%TEMP%&amp;lt;/tt&amp;gt; ning juhuslikku arvu vahemikus 0..32767 (&amp;lt;tt&amp;gt;%RANDOM%&amp;lt;/tt&amp;gt;). Kontrollitakse ega niisugune fail juba ei eksisteeri. Kui juhtub, et niisuguse nimega fail on juba olemas küsitakse uus juhuslik failinimi. Tegevust korratakse seni kuni leitakse &amp;quot;vaba&amp;quot; nimi. Vaba nimi käes, kasutatakse eelmises näites toodud võtet tühja faili loomiseks. Lõpuks kontrollitakse kas faili loomine oli edukas. Kui &amp;lt;tt&amp;gt;COPY&amp;lt;/tt&amp;gt; käsu täitmine mingil põhjusel ebaõnnestus (ketas täis, puudub kirjutusõigus, vigaselt määratud keskkond jms.) katkestatakse koodi täitmine (&amp;lt;tt&amp;gt;EXIT /B&amp;lt;/tt&amp;gt;). Kui töö tehtud, siis on viisakas ajutused failid enda järelt kustutada.&lt;br /&gt;
Paneme tähele, et me ei tea, MIS nimega meile ajutine fail luuakse ja KUHU see täpselt pannakse, aga meie seisukohast pole see absoluutselt oluline, kuna meie jaoks on faili täisnimi alati saadavalt muutujas &amp;lt;tt&amp;gt;%myrndtmp%&amp;lt;/tt&amp;gt; ja sellisel kujul kasutatav.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; väärtusest &amp;quot;[tühik]proov[tühik]&amp;quot; uueks väärtuseks &amp;quot;proov&amp;quot;.&lt;br /&gt;
K6ik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;quot; see on proov &amp;quot;, siis uus väärtus &amp;quot;seeonproov&amp;quot; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese märgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2738</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2738"/>
		<updated>2006-01-12T09:42:53Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Kuidas tekitada ajutist faili */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada ajutist faili===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale on keerukamate ülesannete implmenteerimiseks CMD skripti abil vaja kasutada ajutisi faile. Kuidas seesuguseid viisakalt tekitada.&amp;lt;br&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 :DO&lt;br /&gt;
 SET myrndtmp=%TEMP%\%RANDOM%.tmp&lt;br /&gt;
 IF EXIST %myrndtmp% GOTO DO &lt;br /&gt;
 COPY NUL %myrndtmp%&lt;br /&gt;
 IF ERRORLEVEL 1 EXIT /B&lt;br /&gt;
 &lt;br /&gt;
 :: Teeme midagi kasulikku &lt;br /&gt;
 ECHO foo &amp;gt; %myrndtmp%&lt;br /&gt;
 TYPE %myrndtmp%&lt;br /&gt;
 &lt;br /&gt;
 DEL /Y %myrndtmp%&lt;br /&gt;
Mis meil siin siis toimub? Esiteks seatakse ajutise faili täisnimi (faili nimi koos täieliku teega). Selleks kysitakse süsteemilt ajutiste failide hoidmiseks määratud kataloogi &amp;lt;tt&amp;gt;%TEMP%&amp;lt;/tt&amp;gt; ning juhuslik arv vahemikus 0..32767 (&amp;lt;tt&amp;gt;%RANDOM%&amp;lt;/tt&amp;gt;). Kontrollitakse ega niisugune fail juba ei eksisteeri. Kui juhtub, et niisuguse nimega fail on juba olemas küsitakse uus juhuslik failinimi. Tegevust korratakse seni kuni leitakse &amp;quot;vaba&amp;quot; nimi. Vaba nimi käes, kasutatakse eelmises näites toodud võtet tühja faili loomiseks. Lõpuks kontrollitakse kas faili loomine oli edukas. Kui &amp;lt;tt&amp;gt;COPY&amp;lt;/tt&amp;gt; käsu täitmine mingil põhjusel ebaõnnestus (ketas täis, puudub kirjutusõigus, vigaselt määratud keskkond jms.) katkestatakse koodi täitmine (&amp;lt;tt&amp;gt;EXIT /B&amp;lt;/tt&amp;gt;). Kui töö tehtud, siis on viisakas ajutused failid enda järelt kustutada.&lt;br /&gt;
Paneme tähele, et me ei tea, MIS nimega meile ajutine fail luuakse ja KUHU see täpselt pannakse, aga meie seisukohast pole see absoluutselt oluline, kuna meie jaoks on faili täisnimi alati saadavalt muutujas &amp;lt;tt&amp;gt;%myrndtmp%&amp;lt;/tt&amp;gt; ja sellisel kujul kasutatav.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; väärtusest &amp;quot;[tühik]proov[tühik]&amp;quot; uueks väärtuseks &amp;quot;proov&amp;quot;.&lt;br /&gt;
K6ik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;quot; see on proov &amp;quot;, siis uus väärtus &amp;quot;seeonproov&amp;quot; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese märgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2737</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2737"/>
		<updated>2006-01-12T09:42:25Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Kuidas tekitada ajutist faili */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada ajutist faili===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale on keerukamate ülesannete implmenteerimiseks CMD skripti abil vaja kasutada ajutisi faile. Kuidas seesuguseid viisakalt tekitada.&amp;lt;br&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 :DO&lt;br /&gt;
 SET myrndtmp=%TEMP%\%RANDOM%.tmp&lt;br /&gt;
 IF EXIST %myrndtmp% GOTO DO &lt;br /&gt;
 COPY NUL %myrndtmp%&lt;br /&gt;
 IF ERRORLEVEL 1 EXIT /B&lt;br /&gt;
 &lt;br /&gt;
 :: Teeme midagi kasulikku &lt;br /&gt;
 ECHO foo &amp;gt; %myrndtmp%&lt;br /&gt;
 TYPE %myrndtmp%&lt;br /&gt;
 &lt;br /&gt;
 DEL /Y %myrndtmp%&lt;br /&gt;
Mis meil siin siis toimub? Esiteks seatakse ajutise faili täisnimi (faili nimi koos täieliku teega). Selleks kysitakse süsteemilt ajutiste failide hoidmiseks määratud kataloogi nimi &amp;lt;tt&amp;gt;%TEMP%&amp;lt;/tt&amp;gt; ning juhuslik arv vahemikus 0..32767 (&amp;lt;tt&amp;gt;%RANDOM%&amp;lt;/tt&amp;gt;). Kontrollitakse ega niisugune fail juba ei eksisteeri. Kui juhtub, et niisuguse nimega fail on juba olemas küsitakse uus juhuslik failinimi. Tegevust korratakse seni kuni leitakse &amp;quot;vaba&amp;quot; nimi. Vaba nimi käes, kasutatakse eelmises näites toodud võtet tühja faili loomiseks. Lõpuks kontrollitakse kas faili loomine oli edukas. Kui &amp;lt;tt&amp;gt;COPY&amp;lt;/tt&amp;gt; käsu täitmine mingil põhjusel ebaõnnestus (ketas täis, puudub kirjutusõigus, vigaselt määratud keskkond jms.) katkestatakse koodi täitmine (&amp;lt;tt&amp;gt;EXIT /B&amp;lt;/tt&amp;gt;). Kui töö tehtud, siis on viisakas ajutused failid enda järelt kustutada.&lt;br /&gt;
Paneme tähele, et me ei tea, MIS nimega meile ajutine fail luuakse ja KUHU see täpselt pannakse, aga meie seisukohast pole see absoluutselt oluline, kuna meie jaoks on faili täisnimi alati saadavalt muutujas &amp;lt;tt&amp;gt;%myrndtmp%&amp;lt;/tt&amp;gt; ja sellisel kujul kasutatav.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; väärtusest &amp;quot;[tühik]proov[tühik]&amp;quot; uueks väärtuseks &amp;quot;proov&amp;quot;.&lt;br /&gt;
K6ik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;quot; see on proov &amp;quot;, siis uus väärtus &amp;quot;seeonproov&amp;quot; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese märgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2736</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2736"/>
		<updated>2006-01-12T09:41:55Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Kuidas tekitada tühja faili */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada ajutist faili===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale on keerukamate ülesannete implmenteerimiseks CMD skripti abil vaja kasutada ajutisi faile. Kuidas seesuguseid viisakalt tekitada.&amp;lt;br&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 :DO&lt;br /&gt;
 SET myrndtmp=%TEMP%\%RANDOM%.tmp&lt;br /&gt;
 IF EXIST %myrndtmp% GOTO DO &lt;br /&gt;
 COPY NUL %myrndtmp%&lt;br /&gt;
 IF ERRORLEVEL 1 EXIT /B&lt;br /&gt;
 &lt;br /&gt;
 :: Teeme midagi kasulikku &lt;br /&gt;
 ECHO foo &amp;gt; %myrndtmp%&lt;br /&gt;
 TYPE %myrndtmp%&lt;br /&gt;
&lt;br /&gt;
 DEL /Y %myrndtmp%&lt;br /&gt;
Mis meil siin siis toimub? Esiteks seatakse ajutise faili täisnimi (faili nimi koos täieliku teega). Selleks kysitakse süsteemilt ajutiste failide hoidmiseks määratud kataloogi nimi &amp;lt;tt&amp;gt;%TEMP%&amp;lt;/tt&amp;gt; ning juhuslik arv vahemikus 0..32767 (&amp;lt;tt&amp;gt;%RANDOM%&amp;lt;/tt&amp;gt;). Kontrollitakse ega niisugune fail juba ei eksisteeri. Kui juhtub, et niisuguse nimega fail on juba olemas küsitakse uus juhuslik failinimi. Tegevust korratakse seni kuni leitakse &amp;quot;vaba&amp;quot; nimi. Vaba nimi käes, kasutatakse eelmises näites toodud võtet tühja faili loomiseks. Lõpuks kontrollitakse kas faili loomine oli edukas. Kui &amp;lt;tt&amp;gt;COPY&amp;lt;/tt&amp;gt; käsu täitmine mingil põhjusel ebaõnnestus (ketas täis, puudub kirjutusõigus, vigaselt määratud keskkond jms.) katkestatakse koodi täitmine (&amp;lt;tt&amp;gt;EXIT /B&amp;lt;/tt&amp;gt;). Kui töö tehtud, siis on viisakas ajutused failid enda järelt kustutada.&lt;br /&gt;
Paneme tähele, et me ei tea, MIS nimega meile ajutine fail luuakse ja KUHU see täpselt pannakse, aga meie seisukohast pole see absoluutselt oluline, kuna meie jaoks on faili täisnimi alati saadavalt muutujas &amp;lt;tt&amp;gt;%myrndtmp%&amp;lt;/tt&amp;gt; ja sellisel kujul kasutatav.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; väärtusest &amp;quot;[tühik]proov[tühik]&amp;quot; uueks väärtuseks &amp;quot;proov&amp;quot;.&lt;br /&gt;
K6ik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;quot; see on proov &amp;quot;, siis uus väärtus &amp;quot;seeonproov&amp;quot; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese märgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2735</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2735"/>
		<updated>2006-01-12T09:14:40Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Tühikute eemaldamine sõne algusest ja lõpust */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; väärtusest &amp;quot;[tühik]proov[tühik]&amp;quot; uueks väärtuseks &amp;quot;proov&amp;quot;.&lt;br /&gt;
K6ik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;quot; see on proov &amp;quot;, siis uus väärtus &amp;quot;seeonproov&amp;quot; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese märgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2734</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2734"/>
		<updated>2006-01-12T09:08:39Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Tühikute eemaldamine sõne algusest ja lõpust */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; väärtusest &amp;quot;[tühik]proov[tühik]&amp;quot; uueks väärtuseks &amp;quot;proov&amp;quot;.&lt;br /&gt;
K6ik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;quot; see on proov &amp;quot;, siis uus väärtus &amp;quot;seeonproov&amp;quot; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese m2rgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2733</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2733"/>
		<updated>2006-01-12T09:07:42Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Tühikute eemaldamine sõne algusest ja lõpust */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; väärtusest &amp;quot;[tühik]proov[tühik]&amp;quot; uueks väärtuseks &amp;quot;proov&amp;quot;.&lt;br /&gt;
K6ik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;lt;tt&amp;gt; see on test &amp;lt;/tt&amp;gt;, siis uus väärtus &amp;lt;tt&amp;gt;seeontest&amp;lt;/tt&amp;gt; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese m2rgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2732</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2732"/>
		<updated>2006-01-12T09:05:38Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Kuidas tekitada tühja faili */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
* Käesolev juhend ei pretendeeri vähimalgi määral olema skriptima õppimise juhend algajatele, kuigi sissejuhatuses on toodud mõned selgitavad märkused. Eelkõige peaks see olema [[kokaraamat]], mida algaja skriptija saab mõne keerukama tüüpülesande jaoks kasutada lihtsalt copy-paste abil.&lt;br /&gt;
&lt;br /&gt;
* CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
* Mõlemad keeled on üpris primitiivsed imperatiivsed keeled ja nendes lahenduse realiseerimise keerukus kasvab oluliselt kiiremini, kui ülesande keerukus.  See tähendab, et probleemide arenedes keerustumise suunas, tuleb paratamatult kätte piir, kus on mõistlik senine skript maha jätta ja probleemi tuum realiseerida mõnes 'päris' keeles.  Ära kunagi karda seda sammu!&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
MS-DOS operatsioonisüsteemi kestaks (shell) on käsuinterpretaator command.com. Command.com suhtleb kasutajaga dialoogrežiimis (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 (aka väliskäskude) komplekt kehvapoolne (puuduvad näiteks mõistlikud stringitöötluse vahendid, MS-DOS'i ainutegumilise iseloomu tõttu pole standardsete sisend-väljundvoogude realisatsioon kuigi mõistlik jne.)  Siiski on command.com abil võimalik ühte-teist korda saata. Abiks on siinkohal command.com oskus töödelda käske nn. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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 Microsofti operatsioonisüsteemid otsustada faili sisu üle tema laiendi alusel.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. See on vale, sest CMD on täisvereline 32bitine kaitstud 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 MS-DOSi emuleerimise keskkonnas, aga ilma erivajaduseta pole põhjust seda kasutada. Ka CMD oskab käsujadasid täita &amp;quot;batch&amp;quot; režiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada?====&lt;br /&gt;
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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
====Miks on nendel juhtudel otstarbekas käsuskripte kasutada?====&lt;br /&gt;
Peamised asjaolud, mis käsuskriptid kasulikuks teeb, on:&lt;br /&gt;
* nende interpretaator tuleb Microsofti operatsioonisüsteemiga kaasa;&lt;br /&gt;
* nende keel on sarnane kõnealuse operatsioonisüsteemi tavalisele käsureale.&lt;br /&gt;
&lt;br /&gt;
Esimene nendest asjaoludest annab käsuskriptidele teiste keelte ees teatava logistilise eelise, teine jälle mõtteilma-eelise -- inimesel, kes oskab käsuridu efektiivselt kasutada, on käsuskriptikeele õppimine veidi lihtsam, kui mõne teise keele õppimine.  Aga paljudes olukordades ei rakendu kumbki nendest eelistest ja skripte võib olla kasulik kirjutada [[Perl]]is, [[VBScript]]is või [[Bash]]is.&lt;br /&gt;
&lt;br /&gt;
====Sissejuhatuse lõpetuseks klassikaline näiteprogramm====&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
Esimene rida seab interpretaatori töörežiimile kus väljastatakse ainult see mida käskudel öelda on (vaikimisi väljastab interpretaator ka käsud päras muutujate laiendamist -- see on silumisel väga abiks). Teine rida väljastab teksti &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.  Keerukamate skriptide puhul tasub ka kajamise ajutist sisselülitamist kahtlase skriptiosa ümber -- käsu &amp;quot;@ECHO OFF&amp;quot; paariline on &amp;quot;@ECHO ON&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Tühikute eemaldamine sõne algusest ja lõpust===&lt;br /&gt;
&lt;br /&gt;
Tihtipeale tekib olukord, kus FOR tsükli abil pikemast tekstist parsitud sõnedele jäävad algusesse ja/või lõppu soovimatud tühikud. Üks võimalus nende eemaldamiseks oleks kasutada CMD alamsõnede eemaldamise funktsionaalsust. Vaatleme järgmist koodi:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 SET test = proov &lt;br /&gt;
 SET test=%test: =%&lt;br /&gt;
Selle koodi täitmisel saab muutuja &amp;lt;tt&amp;gt;[tühik]proov[tühik]&amp;lt;/tt&amp;gt; uueks väärtuseks &amp;lt;tt&amp;gt;proov&amp;lt;/tt&amp;gt;.&lt;br /&gt;
K6ik oleks ilus, aga kui meil oleks näiteks niisugune sõne &amp;lt;tt&amp;gt; see on test &amp;lt;/tt&amp;gt;, siis uus väärtus &amp;lt;tt&amp;gt;seeontest&amp;lt;/tt&amp;gt; meid vaevalt rahuldab.&lt;br /&gt;
Ainult sõne algusest ja lõpust tühikute eemaldamiseks sobiks paremini niisugune kood:&amp;lt;BR&amp;gt;&lt;br /&gt;
CMD&lt;br /&gt;
 SET b= see on test &lt;br /&gt;
 IF &amp;quot;%b:~0,1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~1%&lt;br /&gt;
 IF &amp;quot;%b:~-1%&amp;quot;==&amp;quot; &amp;quot; SET b=%b:~0,-1%&lt;br /&gt;
Kood loeb sõnest esimese m2rgi ja kui tegu on tühikuga, siis eemaldab selle (sõne uueks väärtuseks omistatakse kõik märgid peale esimese), kui tegu ei ole tühikuga, siis antakse täitmine edasi järgmisele käsule. See toimib analoogselt, lugedes sõnest viimase märgi.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rgukoormuse_jagaja_ehitamine&amp;diff=2688</id>
		<title>Lihtsa võrgukoormuse jagaja ehitamine</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rgukoormuse_jagaja_ehitamine&amp;diff=2688"/>
		<updated>2005-12-05T13:36:31Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Lihtne load balaning juhuks kui soovitakse koormust mitme erineva internetiühenduse vahel jagada */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Kasulikud Näpunäited]]&lt;br /&gt;
[[Kategooria:Andmeside]]&lt;br /&gt;
[[Kategooria:Võrgukihi juhendid]]&lt;br /&gt;
&lt;br /&gt;
==Lihtne load balaning juhuks kui soovitakse koormust mitme erineva internetiühenduse vahel jagada==&lt;br /&gt;
&lt;br /&gt;
Näites üritatakse koormust jagada KOLME erineva pakkuja välisühenduse vahel&lt;br /&gt;
&lt;br /&gt;
Koormuse jagamine kolme liini vahel (load balancing), mille puhul üks ühendus liigub küll ainult ühte liini mööda, kuid erinevad ühendused saavad kasutada erinevaid liine. On muidugi ilmselge, et niisuguse koormuse jagamise korral peavad tarbijad nägema internetti läbi NAT'i, samuti peab ilmselt eeldama, et sa ise mitte midagi ei serveeri.&lt;br /&gt;
&lt;br /&gt;
Ladna, meil on ilmselt olemas mingi purk, mida me hakkame kasutama oma interneti lüüsina. Et oleks ilus, võiks meil selle purgi küljes olla neli võrguinterfeissi - üks iga liini jaoks pluss üks sisevõrku, kuid paremal puudumisel saab ka kahega hakkama - DSLid peaks siis sellisel juhul ühenduma hubi või switchi kaudu. Purgiks sobib suvaline arvutav seade, mis on võimeline mõnd valge inimese OS'i jooksutama - meie kasutame oma näidetes Linuxit. Kui klassikaline pessukas liiga suur või mürarikas tundub, võib seda tööd vabalt teha ka OpenWRT'd jooksutav WRT54G.&lt;br /&gt;
&lt;br /&gt;
Kahjuks on aga nõnda, et tavaline linuxi tuum ei sisalda ühtegi antud olukorras kasutamiseks ühtegi mõistlikku netfiltri moodulit load balancingu tegemiseks. Võib vabalt olla, et mõnede distributsioonide tuumad sisaldavad juba neid mooduleid, vastasel juhul on vajalik oma tuuma patchida. Netfiltri projekt üllitab perioodiliselt patch-o-matic nimelisi pakke, tasub sikutada nendest viimane ning lasta tuuma vähemalt allpool kasutatud &amp;quot;random&amp;quot; patch, kuid huvi võiks pakkuda ka &amp;quot;nth&amp;quot; patch. Kuidas tuuma paigatakse, peab igaüks ise teadma, sest see väljub pisut antud teemast. Võib-olla saab abi Linuxi foorumist, kuid ma isiklikult soovitan google abil juhendeid otsida. Igaljuhul me eeldame, et vähemalt &amp;quot;random&amp;quot; patch on tuumas sees.&lt;br /&gt;
&lt;br /&gt;
Oleme oma DSLi modemid ära ühendanud. Lihtsuse huvides eeldame, et kõik DSLid on staatilise IP aadressiga ning ei vaja meie poolset PPPoE seadistust.&lt;br /&gt;
Meil on kolm subneti. tavaliselt on neex x.x.x.x/30, kus on ruumi meie masina aadressi ning default gw (mis on siis ISP poolne) aadressi jaoks.&lt;br /&gt;
Enne tegema hakkamist veendume, kas meie süsteemis on olemas utiliidid ip (reeglina pakis iproute või iproute2) ning iptables (reeglina pakis iptables). Juhul kui ei ole, tuleb need utiliidid paigaldada.&lt;br /&gt;
&lt;br /&gt;
Midagi, seadistame oma interfeisid.&lt;br /&gt;
Meie näites olgu eth0 sisevõrgu jaoks ning eth1 - eth3 olgu meie DSLidele.&lt;br /&gt;
Oletame, et sisevõrgu subnet on 192.168.2.0/24,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.1.0/30, kus 42.42.1.1 on meile antud aadress ning 42.42.1.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.2.0/30, kus 42.42.2.1 on meile antud aadress ning 42.42.2.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.3.0/30, kus 42.42.3.1 on meile antud aadress ning 42.42.3.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et sisevõrgus on meie masin aadressiga 192.168.2.254.&lt;br /&gt;
Kuidas iganes me neid interfeise ka ei seadista (see sõltub kasutatavast distributsioonist), oleks tulemus siis selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth0&lt;br /&gt;
 10: eth0: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 192.168.2.254/24 brd 192.168.2.255 scope global eth0&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth1&lt;br /&gt;
 11: eth1: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.1.1/30 brd 42.42.1.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth2&lt;br /&gt;
 12: eth2: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.2.1/30 brd 42.42.2.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth3&lt;br /&gt;
 13: eth3: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.3.1/30 brd 42.42.3.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
Igaks juhuks vaatame ka routingu tabelit. See võiks välja näha selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip route&lt;br /&gt;
 192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.254&lt;br /&gt;
 42.42.1.0/30 dev eth1 proto kernel scope link src 42.42.1.1&lt;br /&gt;
 42.42.2.0/30 dev eth2 proto kernel scope link src 42.42.2.1&lt;br /&gt;
 42.42.3.0/30 dev eth3 proto kernel scope link src 42.42.3.1&lt;br /&gt;
 127.0.0.0/8 via 127.0.0.1 dev lo scope link&lt;br /&gt;
&lt;br /&gt;
Et aga igas enesest lugupidavas routingu tabelis võiks olla default route, siis valime mõne meie liinidest - näiteks kõige kiirema - ning lisame oma routingu tabelisse default route, näiteks: ip route add default via 42.42.3.2. Kindlasti tuleb meeles pidada, et ühes routingu tabelis saab olla ainult üks default route!!!&lt;br /&gt;
&lt;br /&gt;
Olles interfeisid ära seadistanud, kontrollime, kas kõik meile antud default gatewayde aadressid on pingitavad. Juhul kui on, rüüpame lonksu kohvi, õlut, veini, mahla.&lt;br /&gt;
&lt;br /&gt;
Edasi seisame me probleemi ees. Meile on antud kolm default gatewway aadressi, kuid me teame, et igas rotingu tabelis saab olla ainult üks default gateway. Mida teha? Õnneks saab Linuxis olla rohkem kui üks routingu tabel. Üldiselt tunneb Linux routingu tabeleid numbrite järgi, kuid kuna tegemist on ikkagi inimestele mõeldud süsteemiga, on võimalik nendele tabelitele ka nimesid panna. Uurime faili /etc/iproute2/rt_tables. See võiks välja näha umbes selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # cat /etc/iproute2/rt_tables&lt;br /&gt;
 #&lt;br /&gt;
 # reserved values&lt;br /&gt;
 #&lt;br /&gt;
 255 local&lt;br /&gt;
 254 main&lt;br /&gt;
 253 default&lt;br /&gt;
 0 unspec&lt;br /&gt;
 #&lt;br /&gt;
 # local&lt;br /&gt;
 #&lt;br /&gt;
 #1 inr.ruhep&lt;br /&gt;
&lt;br /&gt;
Number rea alguses märgib routingu tabeli numbrit, järgnev tekst selle nime, kõik, mis järgneb # sümbolile, on kommentaar. Trükkides käsureale ip route, näeme me &amp;quot;main&amp;quot; tabeli sisu. See on routingu tabel, mida vaikimisi kasutatakse, vt. üles. Jätame ta esialgu rahule, meil on vaja paika sättida oma kolm default gatewayd.&lt;br /&gt;
Teeme juurde kolm routingu tabelit, saagu nende numbriteks 10, 20 ja 30 ning nimedeks toru1, toru2 ja toru3. Selleks lisame faili /etc/iproute2/rt_tables järgmised read:&lt;br /&gt;
 10 toru1&lt;br /&gt;
 20 toru2&lt;br /&gt;
 30 toru3&lt;br /&gt;
Loomulikult on need tabelid tühjad, kirjutades käsureale näiteks ip route show table toru3, ei väljastata meile mitte midagi, kuid ei viriseta kaa - tabel on olemas, kuid ei sisalda ühtegi kirjet.&lt;br /&gt;
Mis seal siis ikka, täidame need tabelid, looma igasse routingu tabelisse ühe kirje - default route:&lt;br /&gt;
 &lt;br /&gt;
 ip route add default via 42.42.1.2 table toru1&lt;br /&gt;
 ip route add default via 42.42.2.2 table toru2&lt;br /&gt;
 ip route add default via 42.42.3.2 table toru3&lt;br /&gt;
&lt;br /&gt;
Vaatame, kas tuli välja, näiteks sedasi:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip route show table toru3&lt;br /&gt;
 default via 42.42.3.2 dev eth3&lt;br /&gt;
&lt;br /&gt;
Nõndaks. Lonks õlut ning jätkame. Meil on terve hulk routingu tabeleid, igaüks oskab nendest kasutada mingit default gatewayd. Me peame kirjeldama mingid reeglid, mille alusel hakkab süsteem neid tabeleid pruukima. Et oleks lõbusam, oletame, et meie DSL liinid on erineva läbilaskevõimega, mistõttu me tahame, et neid läbiks erinev hulk liiklust. Olgu meil näiteks soov, et liiklus jaguneks liinide vahel järgmiselt: 20%, 30%, 50%. Me peame aru saama, et me ei saa suvaliselt igat n'ndat paketti saata ühe, teise või kolmanda liini peale. Peab olema selge, et kui ühenduse loomisel otsustati, et ühendus peab väljuma näiteks teist liini mööda, siis peavad kõik selle ühenduse juurde kuuluvad paketid seda teed käima - vastasel juhul ei saa välismaailmas olevad serverid mitte mütsigi aru, kes kellega siis lõpuks suhelda tahab. Et paketi kuuluvust ühenduse juurde saab üldiselt üheselt kindlaks teha vaid statefull protokollide korral, näiteks TCP, siis peavad kõik stateless ühendused käima &amp;quot;normaalset&amp;quot; teed mööda, meie näites siis põhiroutingutabeli järgi.&lt;br /&gt;
Selleks, et süsteem oskaks vahet teha, millise ühendusega on tegemist, peame me oma ühendusi kuidagi märgistama. Linuxis on selleks connmark. Connmark on selline &amp;quot;virtuaalne&amp;quot; märk, mida kannavad kõik vastavalt märgitud ühenduse juurde kuuluvad paketid, st. see märk eksisteerib _ainult_ tuuma sisemuses olevates tabelites, mitte pakettide endi payloadis (ehk siis, mitte segamini ajada TOS'iga).&lt;br /&gt;
&lt;br /&gt;
Kirjutame järgmised reeglid (eeldame siinkohal, et netfiltri kõik tabelid on tühjad):&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 20 -j MARK --set-mark 10&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 30 -j MARK --set-mark 20&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 50 -j MARK --set-mark 30&lt;br /&gt;
&lt;br /&gt;
Nende reeglitega märgistame me keskmiselt 20% uutest ühendustest märgiga 10, 30% uutest ühendustest märgiga 20 ning 50% uutest ühendustest märgiga 30. Kindlasti tuleb märgistada ainult uusi ühendusi, sest märgistus on ühenduse põhine ning me ei taha, et ühenduse kestel keegi märgi üle kirjutaks. Samuti ei taha me märgistada ühendusi, mis luuakse meie purgist sisevõrgu poole, selleks kasutame välistavat tingimust -o !eth0 (loogiline, eks).&lt;br /&gt;
Edasi peame me kuidagi süsteemile ütlema, et erineva märgistusega pakettide korral tuleks kasutada erinevaid routingu tabeleid. Teeme järgmised reeglid:&lt;br /&gt;
&lt;br /&gt;
 # ip rule add fwmark 10 table toru1&lt;br /&gt;
 # ip rule add fwmark 20 table toru2&lt;br /&gt;
 # ip rule add fwmark 30 table toru3&lt;br /&gt;
Nende ridade tähendus peaks olema selge - me seome erinevad märgistused erinevate routingu tabelitega ning ütleme seega süsteemile, et kõiki pakette, mis kannavad märgistust 10, tuleb routida routingu tabeli toru1 abil, kõiki pakette, mis kannavad märgistust 20, toru2 abil ning märgistusega 30 pakette suunatakse tabelis toru3 sisalduva järgi.&lt;br /&gt;
Alati, kui me oleme routingu reeglites midagi muutnud, tuleb anda käsk: &lt;br /&gt;
&lt;br /&gt;
 # ip route flush cache&lt;br /&gt;
&lt;br /&gt;
Nimelt Linux, selleks, et ei peaks iga paketi peale routingu tabeleid läbi vaatama, ehitab omale sellise vahva route cache. On selge, et routingu reeglite muutmisel ei ole info cache'is enam korrektne, mistõttu tuleb sellele vesi peale tõmmata.&lt;br /&gt;
Juhul kui seda juba tehtud ei ole, siis on nüüd paras aeg ümber lülitada paar sysctl'i:&lt;br /&gt;
Lubame oma purgil pakette forwardida: &lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
&lt;br /&gt;
Keelame reverse path filtreerimise: &lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.ipv4.conf.all.rp_filter=0&lt;br /&gt;
&lt;br /&gt;
Mis siis sai... Meie süsteem omab hulka routingu tabeleid, oskab teatud tingimuste alusel pakette märgistada, oskab märgistuste alusel kasutada erinevaid routingu tabeleid. Jääb üle vaid ehitada NAT'i reeglid. Kirjutame järgmiselt:&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 42.42.1.1&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 42.42.2.1&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 42.42.3.1&lt;br /&gt;
Ehk siis, pakettidel, mis tahavad väljuda eth1 kaudu (vastav otsus tehti routingu tabeli järgi enne POSTROUTING'usse jõudmist), muudetakse source aadressiks eth1 aadress, mis tahavad väljuda eth2 kaudu, eth2 aadress ning samuti ka eth3 puhul.&lt;br /&gt;
&lt;br /&gt;
Võikski kõik olla. Kindlasti tuleb meie setupi testida - näiteks istutades eth1-eth3 otsa tcpdumbi, tehes sisevõrgust ühendusi ning uurides, millist teed mööda need paketid siis lähevad. Debugimiseks võib netfiltri ahelatesse enne igat rida panna logivad reeglid, mille abil on siis võimalik näha, mis meie pakettidega juhtus.&lt;br /&gt;
Kuidagi tuleb ilmselt kirjutada skriptid, mis need seadistused süsteemi startupi ajal ära teevad, võib-olla ka miski tulemüüri funktsioon juurde ehitada... aga see on juba ilmselgelt teine teema.&lt;br /&gt;
&lt;br /&gt;
Ahjaa, küsite, et mis saab siis nendest pakettidest, mida mangle tabelis ei märgistatud ning mis saab juhul kui random/average jättis mõne paketi märkimata? Well.. ei saa suurt midagi - need paketid rouditakse &amp;quot;main&amp;quot; tabeli alusel (vt. main tabeli default gw.) ning natitakse vastavalt.&lt;br /&gt;
&lt;br /&gt;
Muide, kellele random ei meeldi ning tahab õiget round-robin load balancerit, peaks uurima &amp;quot;nth&amp;quot; moodulit, mis oskab matchida n'indale paketile X hulgast. Selle abil peaks pisukese kujutlusvõime korral round-robini realiseerimine üsna lihtne olema.&lt;br /&gt;
&lt;br /&gt;
Küsite, miks nii keeruliselt, kui ometi ütleb iptables'i manual SNAT'i kohta, et:&lt;br /&gt;
 You can add several --to-source options. If you specify more than one source address, either via an address range or multiple --to-source options, a &lt;br /&gt;
 simple round-robin (one after another in cycle) takes place between these adresses.&lt;br /&gt;
Jah, see on õige, kuid SNAT esineb ainult POSTROUTING ahelas, kuid selleks ajaks kui pakett jõuab POSTROUTING'usse, on routing decision juba tehtud ning seda enam muuta ei saa. Seega peame me oma load balanceri paigutama routing decisionist etepoole.&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
Kõik ülaltoodud näited on üsna sünteetilised. Mul puudub hetkel võimalus(tegelikult küll viitsimine) kirjeldatud olukorra läbi mängimiseks vajaliku testkeskkonna püsti püsti panekuks, mistõttu andestage võimalikud ebatäpsused.&lt;br /&gt;
&lt;br /&gt;
Autor: [[http://foorum.hinnavaatlus.ee/profile.php?mode=viewprofile&amp;amp;u=20974 | wookie]]&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rgukoormuse_jagaja_ehitamine&amp;diff=2687</id>
		<title>Lihtsa võrgukoormuse jagaja ehitamine</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rgukoormuse_jagaja_ehitamine&amp;diff=2687"/>
		<updated>2005-12-05T13:36:04Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Lihtne load balaning juhuks kui soovitakse koormust mitme erineva internetiühenduse vahel jagada */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Kasulikud Näpunäited]]&lt;br /&gt;
[[Kategooria:Andmeside]]&lt;br /&gt;
[[Kategooria:Võrgukihi juhendid]]&lt;br /&gt;
&lt;br /&gt;
==Lihtne load balaning juhuks kui soovitakse koormust mitme erineva internetiühenduse vahel jagada==&lt;br /&gt;
&lt;br /&gt;
Näites üritatakse koormust jagada KOLME erineva pakkuja välisühenduse vahel&lt;br /&gt;
&lt;br /&gt;
Koormuse jagamine kolme liini vahel (load balancing), mille puhul üks ühendus liigub küll ainult ühte liini mööda, kuid erinevad ühendused saavad kasutada erinevaid liine. On muidugi ilmselge, et niisuguse koormuse jagamise korral peavad tarbijad nägema internetti läbi NAT'i, samuti peab ilmselt eeldama, et sa ise mitte midagi ei serveeri.&lt;br /&gt;
&lt;br /&gt;
Ladna, meil on ilmselt olemas mingi purk, mida me hakkame kasutama oma interneti lüüsina. Et oleks ilus, võiks meil selle purgi küljes olla neli võrguinterfeissi - üks iga liini jaoks pluss üks sisevõrku, kuid paremal puudumisel saab ka kahega hakkama - DSLid peaks siis sellisel juhul ühenduma hubi või switchi kaudu. Purgiks sobib suvaline arvutav seade, mis on võimeline mõnd valge inimese OS'i jooksutama - meie kasutame oma näidetes Linuxit. Kui klassikaline pessukas liiga suur või mürarikas tundub, võib seda tööd vabalt teha ka OpenWRT'd jooksutav WRT54G.&lt;br /&gt;
&lt;br /&gt;
Kahjuks on aga nõnda, et tavaline linuxi tuum ei sisalda ühtegi antud olukorras kasutamiseks ühtegi mõistlikku netfiltri moodulit load balancingu tegemiseks. Võib vabalt olla, et mõnede distributsioonide tuumad sisaldavad juba neid mooduleid, vastasel juhul on vajalik oma tuuma patchida. Netfiltri projekt üllitab perioodiliselt patch-o-matic nimelisi pakke, tasub sikutada nendest viimane ning lasta tuuma vähemalt allpool kasutatud &amp;quot;random&amp;quot; patch, kuid huvi võiks pakkuda ka &amp;quot;nth&amp;quot; patch. Kuidas tuuma paigatakse, peab igaüks ise teadma, sest see väljub pisut antud teemast. Võib-olla saab abi Linuxi foorumist, kuid ma isiklikult soovitan google abil juhendeid otsida. Igaljuhul me eeldame, et vähemalt &amp;quot;random&amp;quot; patch on tuumas sees.&lt;br /&gt;
&lt;br /&gt;
Oleme oma DSLi modemid ära ühendanud. Lihtsuse huvides eeldame, et kõik DSLid on staatilise IP aadressiga ning ei vaja meie poolset PPPoE seadistust.&lt;br /&gt;
Meil on kolm subneti. tavaliselt on neex x.x.x.x/30, kus on ruumi meie masina aadressi ning default gw (mis on siis ISP poolne) aadressi jaoks.&lt;br /&gt;
Enne tegema hakkamist veendume, kas meie süsteemis on olemas utiliidid ip (reeglina pakis iproute või iproute2) ning iptables (reeglina pakis iptables). Juhul kui ei ole, tuleb need utiliidid paigaldada.&lt;br /&gt;
&lt;br /&gt;
Midagi, seadistame oma interfeisid.&lt;br /&gt;
Meie näites olgu eth0 sisevõrgu jaoks ning eth1 - eth3 olgu meie DSLidele.&lt;br /&gt;
Oletame, et sisevõrgu subnet on 192.168.2.0/24,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.1.0/30, kus 42.42.1.1 on meile antud aadress ning 42.42.1.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.2.0/30, kus 42.42.2.1 on meile antud aadress ning 42.42.2.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.3.0/30, kus 42.42.3.1 on meile antud aadress ning 42.42.3.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et sisevõrgus on meie masin aadressiga 192.168.2.254.&lt;br /&gt;
Kuidas iganes me neid interfeise ka ei seadista (see sõltub kasutatavast distributsioonist), oleks tulemus siis selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth0&lt;br /&gt;
 10: eth0: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 192.168.2.254/24 brd 192.168.2.255 scope global eth0&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth1&lt;br /&gt;
 11: eth1: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.1.1/30 brd 42.42.1.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth2&lt;br /&gt;
 12: eth2: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.2.1/30 brd 42.42.2.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth3&lt;br /&gt;
 13: eth3: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.3.1/30 brd 42.42.3.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
Igaks juhuks vaatame ka routingu tabelit. See võiks välja näha selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip route&lt;br /&gt;
 192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.254&lt;br /&gt;
 42.42.1.0/30 dev eth1 proto kernel scope link src 42.42.1.1&lt;br /&gt;
 42.42.2.0/30 dev eth2 proto kernel scope link src 42.42.2.1&lt;br /&gt;
 42.42.3.0/30 dev eth3 proto kernel scope link src 42.42.3.1&lt;br /&gt;
 127.0.0.0/8 via 127.0.0.1 dev lo scope link&lt;br /&gt;
&lt;br /&gt;
Et aga igas enesest lugupidavas routingu tabelis võiks olla default route, siis valime mõne meie liinidest - näiteks kõige kiirema - ning lisame oma routingu tabelisse default route, näiteks: ip route add default via 42.42.3.2. Kindlasti tuleb meeles pidada, et ühes routingu tabelis saab olla ainult üks default route!!!&lt;br /&gt;
&lt;br /&gt;
Olles interfeisid ära seadistanud, kontrollime, kas kõik meile antud default gatewayde aadressid on pingitavad. Juhul kui on, rüüpame lonksu kohvi, õlut, veini, mahla.&lt;br /&gt;
&lt;br /&gt;
Edasi seisame me probleemi ees. Meile on antud kolm default gatewway aadressi, kuid me teame, et igas rotingu tabelis saab olla ainult üks default gateway. Mida teha? Õnneks saab Linuxis olla rohkem kui üks routingu tabel. Üldiselt tunneb Linux routingu tabeleid numbrite järgi, kuid kuna tegemist on ikkagi inimestele mõeldud süsteemiga, on võimalik nendele tabelitele ka nimesid panna. Uurime faili /etc/iproute2/rt_tables. See võiks välja näha umbes selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # cat /etc/iproute2/rt_tables&lt;br /&gt;
 #&lt;br /&gt;
 # reserved values&lt;br /&gt;
 #&lt;br /&gt;
 255 local&lt;br /&gt;
 254 main&lt;br /&gt;
 253 default&lt;br /&gt;
 0 unspec&lt;br /&gt;
 #&lt;br /&gt;
 # local&lt;br /&gt;
 #&lt;br /&gt;
 #1 inr.ruhep&lt;br /&gt;
&lt;br /&gt;
Number rea alguses märgib routingu tabeli numbrit, järgnev tekst selle nime, kõik, mis järgneb # sümbolile, on kommentaar. Trükkides käsureale ip route, näeme me &amp;quot;main&amp;quot; tabeli sisu. See on routingu tabel, mida vaikimisi kasutatakse, vt. üles. Jätame ta esialgu rahule, meil on vaja paika sättida oma kolm default gatewayd.&lt;br /&gt;
Teeme juurde kolm routingu tabelit, saagu nende numbriteks 10, 20 ja 30 ning nimedeks toru1, toru2 ja toru3. Selleks lisame faili /etc/iproute2/rt_tables järgmised read:&lt;br /&gt;
 10 toru1&lt;br /&gt;
 20 toru2&lt;br /&gt;
 30 toru3&lt;br /&gt;
Loomulikult on need tabelid tühjad, kirjutades käsureale näiteks ip route show table toru3, ei väljastata meile mitte midagi, kuid ei viriseta kaa - tabel on olemas, kuid ei sisalda ühtegi kirjet.&lt;br /&gt;
Mis seal siis ikka, täidame need tabelid, looma igasse routingu tabelisse ühe kirje - default route:&lt;br /&gt;
 &lt;br /&gt;
 ip route add default via 42.42.1.2 table toru1&lt;br /&gt;
 ip route add default via 42.42.2.2 table toru2&lt;br /&gt;
 ip route add default via 42.42.3.2 table toru3&lt;br /&gt;
&lt;br /&gt;
Vaatame, kas tuli välja, näiteks sedasi:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip route show table toru3&lt;br /&gt;
 default via 42.42.3.2 dev eth3&lt;br /&gt;
&lt;br /&gt;
Nõndaks. Lonks õlut ning jätkame. Meil on terve hulk routingu tabeleid, igaüks oskab nendest kasutada mingit default gatewayd. Me peame kirjeldama mingid reeglid, mille alusel hakkab süsteem neid tabeleid pruukima. Et oleks lõbusam, oletame, et meie DSL liinid on erineva läbilaskevõimega, mistõttu me tahame, et neid läbiks erinev hulk liiklust. Olgu meil näiteks soov, et liiklus jaguneks liinide vahel järgmiselt: 20%, 30%, 50%. Me peame aru saama, et me ei saa suvaliselt igat n'ndat paketti saata ühe, teise või kolmanda liini peale. Peab olema selge, et kui ühenduse loomisel otsustati, et ühendus peab väljuma näiteks teist liini mööda, siis peavad kõik selle ühenduse juurde kuuluvad paketid seda teed käima - vastasel juhul ei saa välismaailmas olevad serverid mitte mütsigi aru, kes kellega siis lõpuks suhelda tahab. Et paketi kuuluvust ühenduse juurde saab üldiselt üheselt kindlaks teha vaid statefull protokollide korral, näiteks TCP, siis peavad kõik stateless ühendused käima &amp;quot;normaalset&amp;quot; teed mööda, meie näites siis põhiroutingutabeli järgi.&lt;br /&gt;
Selleks, et süsteem oskaks vahet teha, millise ühendusega on tegemist, peame me oma ühendusi kuidagi märgistama. Linuxis on selleks connmark. Connmark on selline &amp;quot;virtuaalne&amp;quot; märk, mida kannavad kõik vastavalt märgitud ühenduse juurde kuuluvad paketid, st. see märk eksisteerib _ainult_ tuuma sisemuses olevates tabelites, mitte pakettide endi payloadis (ehk siis, mitte segamini ajada TOS'iga).&lt;br /&gt;
&lt;br /&gt;
Kirjutame järgmised reeglid (eeldame siinkohal, et netfiltri kõik tabelid on tühjad):&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 20 -j MARK --set-mark 10&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 30 -j MARK --set-mark 20&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 50 -j MARK --set-mark 30&lt;br /&gt;
&lt;br /&gt;
Nende reeglitega märgistame me keskmiselt 20% uutest ühendustest märgiga 10, 30% uutest ühendustest märgiga 20 ning 50% uutest ühendustest märgiga 30. Kindlasti tuleb märgistada ainult uusi ühendusi, sest märgistus on ühenduse põhine ning me ei taha, et ühenduse kestel keegi märgi üle kirjutaks. Samuti ei taha me märgistada ühendusi, mis luuakse meie purgist sisevõrgu poole, selleks kasutame välistavat tingimust -o !eth0 (loogiline, eks).&lt;br /&gt;
Edasi peame me kuidagi süsteemile ütlema, et erineva märgistusega pakettide korral tuleks kasutada erinevaid routingu tabeleid. Teeme järgmised reeglid:&lt;br /&gt;
&lt;br /&gt;
 # ip rule add fwmark 10 table toru1&lt;br /&gt;
 # ip rule add fwmark 20 table toru2&lt;br /&gt;
 # ip rule add fwmark 30 table toru3&lt;br /&gt;
Nende ridade tähendus peaks olema selge - me seome erinevad märgistused erinevate routingu tabelitega ning ütleme seega süsteemile, et kõiki pakette, mis kannavad märgistust 10, tuleb routida routingu tabeli toru1 abil, kõiki pakette, mis kannavad märgistust 20, toru2 abil ning märgistusega 30 pakette suunatakse tabelis toru3 sisalduva järgi.&lt;br /&gt;
Alati, kui me oleme routingu reeglites midagi muutnud, tuleb anda käsk: &lt;br /&gt;
&lt;br /&gt;
 # ip route flush cache&lt;br /&gt;
&lt;br /&gt;
Nimelt Linux, selleks, et ei peaks iga paketi peale routingu tabeleid läbi vaatama, ehitab omale sellise vahva route cache. On selge, et routingu reeglite muutmisel ei ole info cache'is enam korrektne, mistõttu tuleb sellele vesi peale tõmmata.&lt;br /&gt;
Juhul kui seda juba tehtud ei ole, siis on nüüd paras aeg ümber lülitada paar sysctl'i:&lt;br /&gt;
Lubame oma purgil pakette forwardida: &lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
&lt;br /&gt;
Keelame reverse path filtreerimise: &lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.ipv4.conf.all.rp_filter=0&lt;br /&gt;
&lt;br /&gt;
Mis siis sai... Meie süsteem omab hulka routingu tabeleid, oskab teatud tingimuste alusel pakette märgistada, oskab märgistuste alusel kasutada erinevaid routingu tabeleid. Jääb üle vaid ehitada NAT'i reeglid. Kirjutame järgmiselt:&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 42.42.1.1&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 42.42.2.1&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 42.42.3.1&lt;br /&gt;
Ehk siis, pakettidel, mis tahavad väljuda eth1 kaudu (vastav otsus tehti routingu tabeli järgi enne POSTROUTING'usse jõudmist), muudetakse source aadressiks eth1 aadress, mis tahavad väljuda eth2 kaudu, eth2 aadress ning samuti ka eth3 puhul.&lt;br /&gt;
&lt;br /&gt;
Võikski kõik olla. Kindlasti tuleb meie setupi testida - näiteks istutades eth1-eth3 otsa tcpdumbi, tehes sisevõrgust ühendusi ning uurides, millist teed mööda need paketid siis lähevad. Debugimiseks võib netfiltri ahelatesse enne igat rida panna logivad reeglid, mille abil on siis võimalik näha, mis meie pakettidega juhtus.&lt;br /&gt;
Kuidagi tuleb ilmselt kirjutada skriptid, mis need seadistused süsteemi startupi ajal ära teevad, võib-olla ka miski tulemüüri funktsioon juurde ehitada... aga see on juba ilmselgelt teine teema.&lt;br /&gt;
&lt;br /&gt;
Ahjaa, küsite, et mis saab siis nendest pakettidest, mida mangle tabelis ei märgistatud ning mis saab juhul kui random/average jättis mõne paketi märkimata? Well.. ei saa suurt midagi - need paketid rouditakse &amp;quot;main&amp;quot; tabeli alusel (vt. main tabeli default gw.) ning natitakse vastavalt.&lt;br /&gt;
&lt;br /&gt;
Muide, kellele random ei meeldi ning tahab õiget round-robin load balancerit, peaks uurima &amp;quot;nth&amp;quot; moodulit, mis oskab matchida n'indale paketile X hulgast. Selle abil peaks pisukese kujutlusvõime korral round-robini realiseerimine üsna lihtne olema.&lt;br /&gt;
&lt;br /&gt;
Küsite, miks nii keeruliselt, kui ometi ütleb iptables'i manual SNAT'i kohta, et:&lt;br /&gt;
 You can add several --to-source options. If you specify more than one source address, either via an address range or multiple --to-source options, a &lt;br /&gt;
 simple round-robin (one after another in cycle) takes place between these adresses.&lt;br /&gt;
Jah, see on õige, kuid SNAT esineb ainult POSTROUTING ahelas, kuid selleks ajaks kui pakett jõuab POSTROUTING'usse, on routing decision juba tehtud ning seda enam muuta ei saa. Seega peame me oma load balanceri paigutama routing decisionist etepoole.&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
Kõik ülaltoodud näited on üsna sünteetilised. Mul puudub hetkel võimalus(tegelikult küll viitsimine) kirjeldatud olukorra läbi mängimiseks vajaliku testkeskkonna püsti püsti panekuks, mistõttu andestage võimalikud ebatäpsused.&lt;br /&gt;
&lt;br /&gt;
Autor: [[http://foorum.hinnavaatlus.ee/profile.php?mode=viewprofile&amp;amp;u=20974|wookie]]&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rgukoormuse_jagaja_ehitamine&amp;diff=2686</id>
		<title>Lihtsa võrgukoormuse jagaja ehitamine</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rgukoormuse_jagaja_ehitamine&amp;diff=2686"/>
		<updated>2005-12-05T13:34:32Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Lihtne load balaning juhuks kui soovitakse koormust mitme erineva internetiühenduse vahel jagada */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Kasulikud Näpunäited]]&lt;br /&gt;
[[Kategooria:Andmeside]]&lt;br /&gt;
[[Kategooria:Võrgukihi juhendid]]&lt;br /&gt;
&lt;br /&gt;
==Lihtne load balaning juhuks kui soovitakse koormust mitme erineva internetiühenduse vahel jagada==&lt;br /&gt;
&lt;br /&gt;
Näites üritatakse koormust jagada KOLME erineva pakkuja välisühenduse vahel&lt;br /&gt;
&lt;br /&gt;
Koormuse jagamine kolme liini vahel (load balancing), mille puhul üks ühendus liigub küll ainult ühte liini mööda, kuid erinevad ühendused saavad kasutada erinevaid liine. On muidugi ilmselge, et niisuguse koormuse jagamise korral peavad tarbijad nägema internetti läbi NAT'i, samuti peab ilmselt eeldama, et sa ise mitte midagi ei serveeri.&lt;br /&gt;
&lt;br /&gt;
Ladna, meil on ilmselt olemas mingi purk, mida me hakkame kasutama oma interneti lüüsina. Et oleks ilus, võiks meil selle purgi küljes olla neli võrguinterfeissi - üks iga liini jaoks pluss üks sisevõrku, kuid paremal puudumisel saab ka kahega hakkama - DSLid peaks siis sellisel juhul ühenduma hubi või switchi kaudu. Purgiks sobib suvaline arvutav seade, mis on võimeline mõnd valge inimese OS'i jooksutama - meie kasutame oma näidetes Linuxit. Kui klassikaline pessukas liiga suur või mürarikas tundub, võib seda tööd vabalt teha ka OpenWRT'd jooksutav WRT54G.&lt;br /&gt;
&lt;br /&gt;
Kahjuks on aga nõnda, et tavaline linuxi tuum ei sisalda ühtegi antud olukorras kasutamiseks ühtegi mõistlikku netfiltri moodulit load balancingu tegemiseks. Võib vabalt olla, et mõnede distributsioonide tuumad sisaldavad juba neid mooduleid, vastasel juhul on vajalik oma tuuma patchida. Netfiltri projekt üllitab perioodiliselt patch-o-matic nimelisi pakke, tasub sikutada nendest viimane ning lasta tuuma vähemalt allpool kasutatud &amp;quot;random&amp;quot; patch, kuid huvi võiks pakkuda ka &amp;quot;nth&amp;quot; patch. Kuidas tuuma paigatakse, peab igaüks ise teadma, sest see väljub pisut antud teemast. Võib-olla saab abi Linuxi foorumist, kuid ma isiklikult soovitan google abil juhendeid otsida. Igaljuhul me eeldame, et vähemalt &amp;quot;random&amp;quot; patch on tuumas sees.&lt;br /&gt;
&lt;br /&gt;
Oleme oma DSLi modemid ära ühendanud. Lihtsuse huvides eeldame, et kõik DSLid on staatilise IP aadressiga ning ei vaja meie poolset PPPoE seadistust.&lt;br /&gt;
Meil on kolm subneti. tavaliselt on neex x.x.x.x/30, kus on ruumi meie masina aadressi ning default gw (mis on siis ISP poolne) aadressi jaoks.&lt;br /&gt;
Enne tegema hakkamist veendume, kas meie süsteemis on olemas utiliidid ip (reeglina pakis iproute või iproute2) ning iptables (reeglina pakis iptables). Juhul kui ei ole, tuleb need utiliidid paigaldada.&lt;br /&gt;
&lt;br /&gt;
Midagi, seadistame oma interfeisid.&lt;br /&gt;
Meie näites olgu eth0 sisevõrgu jaoks ning eth1 - eth3 olgu meie DSLidele.&lt;br /&gt;
Oletame, et sisevõrgu subnet on 192.168.2.0/24,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.1.0/30, kus 42.42.1.1 on meile antud aadress ning 42.42.1.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.2.0/30, kus 42.42.2.1 on meile antud aadress ning 42.42.2.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.3.0/30, kus 42.42.3.1 on meile antud aadress ning 42.42.3.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et sisevõrgus on meie masin aadressiga 192.168.2.254.&lt;br /&gt;
Kuidas iganes me neid interfeise ka ei seadista (see sõltub kasutatavast distributsioonist), oleks tulemus siis selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth0&lt;br /&gt;
 10: eth0: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 192.168.2.254/24 brd 192.168.2.255 scope global eth0&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth1&lt;br /&gt;
 11: eth1: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.1.1/30 brd 42.42.1.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth2&lt;br /&gt;
 12: eth2: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.2.1/30 brd 42.42.2.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth3&lt;br /&gt;
 13: eth3: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.3.1/30 brd 42.42.3.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
Igaks juhuks vaatame ka routingu tabelit. See võiks välja näha selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip route&lt;br /&gt;
 192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.254&lt;br /&gt;
 42.42.1.0/30 dev eth1 proto kernel scope link src 42.42.1.1&lt;br /&gt;
 42.42.2.0/30 dev eth2 proto kernel scope link src 42.42.2.1&lt;br /&gt;
 42.42.3.0/30 dev eth3 proto kernel scope link src 42.42.3.1&lt;br /&gt;
 127.0.0.0/8 via 127.0.0.1 dev lo scope link&lt;br /&gt;
&lt;br /&gt;
Et aga igas enesest lugupidavas routingu tabelis võiks olla default route, siis valime mõne meie liinidest - näiteks kõige kiirema - ning lisame oma routingu tabelisse default route, näiteks: ip route add default via 42.42.3.2. Kindlasti tuleb meeles pidada, et ühes routingu tabelis saab olla ainult üks default route!!!&lt;br /&gt;
&lt;br /&gt;
Olles interfeisid ära seadistanud, kontrollime, kas kõik meile antud default gatewayde aadressid on pingitavad. Juhul kui on, rüüpame lonksu kohvi, õlut, veini, mahla.&lt;br /&gt;
&lt;br /&gt;
Edasi seisame me probleemi ees. Meile on antud kolm default gatewway aadressi, kuid me teame, et igas rotingu tabelis saab olla ainult üks default gateway. Mida teha? Õnneks saab Linuxis olla rohkem kui üks routingu tabel. Üldiselt tunneb Linux routingu tabeleid numbrite järgi, kuid kuna tegemist on ikkagi inimestele mõeldud süsteemiga, on võimalik nendele tabelitele ka nimesid panna. Uurime faili /etc/iproute2/rt_tables. See võiks välja näha umbes selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # cat /etc/iproute2/rt_tables&lt;br /&gt;
 #&lt;br /&gt;
 # reserved values&lt;br /&gt;
 #&lt;br /&gt;
 255 local&lt;br /&gt;
 254 main&lt;br /&gt;
 253 default&lt;br /&gt;
 0 unspec&lt;br /&gt;
 #&lt;br /&gt;
 # local&lt;br /&gt;
 #&lt;br /&gt;
 #1 inr.ruhep&lt;br /&gt;
&lt;br /&gt;
Number rea alguses märgib routingu tabeli numbrit, järgnev tekst selle nime, kõik, mis järgneb # sümbolile, on kommentaar. Trükkides käsureale ip route, näeme me &amp;quot;main&amp;quot; tabeli sisu. See on routingu tabel, mida vaikimisi kasutatakse, vt. üles. Jätame ta esialgu rahule, meil on vaja paika sättida oma kolm default gatewayd.&lt;br /&gt;
Teeme juurde kolm routingu tabelit, saagu nende numbriteks 10, 20 ja 30 ning nimedeks toru1, toru2 ja toru3. Selleks lisame faili /etc/iproute2/rt_tables järgmised read:&lt;br /&gt;
 10 toru1&lt;br /&gt;
 20 toru2&lt;br /&gt;
 30 toru3&lt;br /&gt;
Loomulikult on need tabelid tühjad, kirjutades käsureale näiteks ip route show table toru3, ei väljastata meile mitte midagi, kuid ei viriseta kaa - tabel on olemas, kuid ei sisalda ühtegi kirjet.&lt;br /&gt;
Mis seal siis ikka, täidame need tabelid, looma igasse routingu tabelisse ühe kirje - default route:&lt;br /&gt;
 &lt;br /&gt;
 ip route add default via 42.42.1.2 table toru1&lt;br /&gt;
 ip route add default via 42.42.2.2 table toru2&lt;br /&gt;
 ip route add default via 42.42.3.2 table toru3&lt;br /&gt;
&lt;br /&gt;
Vaatame, kas tuli välja, näiteks sedasi:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip route show table toru3&lt;br /&gt;
 default via 42.42.3.2 dev eth3&lt;br /&gt;
&lt;br /&gt;
Nõndaks. Lonks õlut ning jätkame. Meil on terve hulk routingu tabeleid, igaüks oskab nendest kasutada mingit default gatewayd. Me peame kirjeldama mingid reeglid, mille alusel hakkab süsteem neid tabeleid pruukima. Et oleks lõbusam, oletame, et meie DSL liinid on erineva läbilaskevõimega, mistõttu me tahame, et neid läbiks erinev hulk liiklust. Olgu meil näiteks soov, et liiklus jaguneks liinide vahel järgmiselt: 20%, 30%, 50%. Me peame aru saama, et me ei saa suvaliselt igat n'ndat paketti saata ühe, teise või kolmanda liini peale. Peab olema selge, et kui ühenduse loomisel otsustati, et ühendus peab väljuma näiteks teist liini mööda, siis peavad kõik selle ühenduse juurde kuuluvad paketid seda teed käima - vastasel juhul ei saa välismaailmas olevad serverid mitte mütsigi aru, kes kellega siis lõpuks suhelda tahab. Et paketi kuuluvust ühenduse juurde saab üldiselt üheselt kindlaks teha vaid statefull protokollide korral, näiteks TCP, siis peavad kõik stateless ühendused käima &amp;quot;normaalset&amp;quot; teed mööda, meie näites siis põhiroutingutabeli järgi.&lt;br /&gt;
Selleks, et süsteem oskaks vahet teha, millise ühendusega on tegemist, peame me oma ühendusi kuidagi märgistama. Linuxis on selleks connmark. Connmark on selline &amp;quot;virtuaalne&amp;quot; märk, mida kannavad kõik vastavalt märgitud ühenduse juurde kuuluvad paketid, st. see märk eksisteerib _ainult_ tuuma sisemuses olevates tabelites, mitte pakettide endi payloadis (ehk siis, mitte segamini ajada TOS'iga).&lt;br /&gt;
&lt;br /&gt;
Kirjutame järgmised reeglid (eeldame siinkohal, et netfiltri kõik tabelid on tühjad):&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 20 -j MARK --set-mark 10&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 30 -j MARK --set-mark 20&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 50 -j MARK --set-mark 30&lt;br /&gt;
&lt;br /&gt;
Nende reeglitega märgistame me keskmiselt 20% uutest ühendustest märgiga 10, 30% uutest ühendustest märgiga 20 ning 50% uutest ühendustest märgiga 30. Kindlasti tuleb märgistada ainult uusi ühendusi, sest märgistus on ühenduse põhine ning me ei taha, et ühenduse kestel keegi märgi üle kirjutaks. Samuti ei taha me märgistada ühendusi, mis luuakse meie purgist sisevõrgu poole, selleks kasutame välistavat tingimust -o !eth0 (loogiline, eks).&lt;br /&gt;
Edasi peame me kuidagi süsteemile ütlema, et erineva märgistusega pakettide korral tuleks kasutada erinevaid routingu tabeleid. Teeme järgmised reeglid:&lt;br /&gt;
&lt;br /&gt;
 # ip rule add fwmark 10 table toru1&lt;br /&gt;
 # ip rule add fwmark 20 table toru2&lt;br /&gt;
 # ip rule add fwmark 30 table toru3&lt;br /&gt;
Nende ridade tähendus peaks olema selge - me seome erinevad märgistused erinevate routingu tabelitega ning ütleme seega süsteemile, et kõiki pakette, mis kannavad märgistust 10, tuleb routida routingu tabeli toru1 abil, kõiki pakette, mis kannavad märgistust 20, toru2 abil ning märgistusega 30 pakette suunatakse tabelis toru3 sisalduva järgi.&lt;br /&gt;
Alati, kui me oleme routingu reeglites midagi muutnud, tuleb anda käsk: &lt;br /&gt;
&lt;br /&gt;
 # ip route flush cache&lt;br /&gt;
&lt;br /&gt;
Nimelt Linux, selleks, et ei peaks iga paketi peale routingu tabeleid läbi vaatama, ehitab omale sellise vahva route cache. On selge, et routingu reeglite muutmisel ei ole info cache'is enam korrektne, mistõttu tuleb sellele vesi peale tõmmata.&lt;br /&gt;
Juhul kui seda juba tehtud ei ole, siis on nüüd paras aeg ümber lülitada paar sysctl'i:&lt;br /&gt;
Lubame oma purgil pakette forwardida: &lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
&lt;br /&gt;
Keelame reverse path filtreerimise: &lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.ipv4.conf.all.rp_filter=0&lt;br /&gt;
&lt;br /&gt;
Mis siis sai... Meie süsteem omab hulka routingu tabeleid, oskab teatud tingimuste alusel pakette märgistada, oskab märgistuste alusel kasutada erinevaid routingu tabeleid. Jääb üle vaid ehitada NAT'i reeglid. Kirjutame järgmiselt:&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 42.42.1.1&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 42.42.2.1&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 42.42.3.1&lt;br /&gt;
Ehk siis, pakettidel, mis tahavad väljuda eth1 kaudu (vastav otsus tehti routingu tabeli järgi enne POSTROUTING'usse jõudmist), muudetakse source aadressiks eth1 aadress, mis tahavad väljuda eth2 kaudu, eth2 aadress ning samuti ka eth3 puhul.&lt;br /&gt;
&lt;br /&gt;
Võikski kõik olla. Kindlasti tuleb meie setupi testida - näiteks istutades eth1-eth3 otsa tcpdumbi, tehes sisevõrgust ühendusi ning uurides, millist teed mööda need paketid siis lähevad. Debugimiseks võib netfiltri ahelatesse enne igat rida panna logivad reeglid, mille abil on siis võimalik näha, mis meie pakettidega juhtus.&lt;br /&gt;
Kuidagi tuleb ilmselt kirjutada skriptid, mis need seadistused süsteemi startupi ajal ära teevad, võib-olla ka miski tulemüüri funktsioon juurde ehitada... aga see on juba ilmselgelt teine teema.&lt;br /&gt;
&lt;br /&gt;
Ahjaa, küsite, et mis saab siis nendest pakettidest, mida mangle tabelis ei märgistatud ning mis saab juhul kui random/average jättis mõne paketi märkimata? Well.. ei saa suurt midagi - need paketid rouditakse &amp;quot;main&amp;quot; tabeli alusel (vt. main tabeli default gw.) ning natitakse vastavalt.&lt;br /&gt;
&lt;br /&gt;
Muide, kellele random ei meeldi ning tahab õiget round-robin load balancerit, peaks uurima &amp;quot;nth&amp;quot; moodulit, mis oskab matchida n'indale paketile X hulgast. Selle abil peaks pisukese kujutlusvõime korral round-robini realiseerimine üsna lihtne olema.&lt;br /&gt;
&lt;br /&gt;
Küsite, miks nii keeruliselt, kui ometi ütleb iptables'i manual SNAT'i kohta, et:&lt;br /&gt;
 You can add several --to-source options. If you specify more than one source address, either via an address range or multiple --to-source options, a &lt;br /&gt;
 simple round-robin (one after another in cycle) takes place between these adresses.&lt;br /&gt;
Jah, see on õige, kuid SNAT esineb ainult POSTROUTING ahelas, kuid selleks ajaks kui pakett jõuab POSTROUTING'usse, on routing decision juba tehtud ning seda enam muuta ei saa. Seega peame me oma load balanceri paigutama routing decisionist etepoole.&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
Kõik ülaltoodud näited on üsna sünteetilised. Mul puudub hetkel võimalus(tegelikult küll viitsimine) kirjeldatud olukorra läbi mängimiseks vajaliku testkeskkonna püsti püsti panekuks, mistõttu andestage võimalikud ebatäpsused.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rgukoormuse_jagaja_ehitamine&amp;diff=2685</id>
		<title>Lihtsa võrgukoormuse jagaja ehitamine</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rgukoormuse_jagaja_ehitamine&amp;diff=2685"/>
		<updated>2005-12-05T13:32:49Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lihtne load balaning juhuks kui soovitakse koormust mitme erineva internetiühenduse vahel jagada==&lt;br /&gt;
&lt;br /&gt;
Näites üritatakse koormust jagada KOLME erineva pakkuja välisühenduse vahel&lt;br /&gt;
&lt;br /&gt;
Koormuse jagamine kolme liini vahel (load balancing), mille puhul üks ühendus liigub küll ainult ühte liini mööda, kuid erinevad ühendused saavad kasutada erinevaid liine. On muidugi ilmselge, et niisuguse koormuse jagamise korral peavad tarbijad nägema internetti läbi NAT'i, samuti peab ilmselt eeldama, et sa ise mitte midagi ei serveeri.&lt;br /&gt;
&lt;br /&gt;
Ladna, meil on ilmselt olemas mingi purk, mida me hakkame kasutama oma interneti lüüsina. Et oleks ilus, võiks meil selle purgi küljes olla neli võrguinterfeissi - üks iga liini jaoks pluss üks sisevõrku, kuid paremal puudumisel saab ka kahega hakkama - DSLid peaks siis sellisel juhul ühenduma hubi või switchi kaudu. Purgiks sobib suvaline arvutav seade, mis on võimeline mõnd valge inimese OS'i jooksutama - meie kasutame oma näidetes Linuxit. Kui klassikaline pessukas liiga suur või mürarikas tundub, võib seda tööd vabalt teha ka OpenWRT'd jooksutav WRT54G.&lt;br /&gt;
&lt;br /&gt;
Kahjuks on aga nõnda, et tavaline linuxi tuum ei sisalda ühtegi antud olukorras kasutamiseks ühtegi mõistlikku netfiltri moodulit load balancingu tegemiseks. Võib vabalt olla, et mõnede distributsioonide tuumad sisaldavad juba neid mooduleid, vastasel juhul on vajalik oma tuuma patchida. Netfiltri projekt üllitab perioodiliselt patch-o-matic nimelisi pakke, tasub sikutada nendest viimane ning lasta tuuma vähemalt allpool kasutatud &amp;quot;random&amp;quot; patch, kuid huvi võiks pakkuda ka &amp;quot;nth&amp;quot; patch. Kuidas tuuma paigatakse, peab igaüks ise teadma, sest see väljub pisut antud teemast. Võib-olla saab abi Linuxi foorumist, kuid ma isiklikult soovitan google abil juhendeid otsida. Igaljuhul me eeldame, et vähemalt &amp;quot;random&amp;quot; patch on tuumas sees.&lt;br /&gt;
&lt;br /&gt;
Oleme oma DSLi modemid ära ühendanud. Lihtsuse huvides eeldame, et kõik DSLid on staatilise IP aadressiga ning ei vaja meie poolset PPPoE seadistust.&lt;br /&gt;
Meil on kolm subneti. tavaliselt on neex x.x.x.x/30, kus on ruumi meie masina aadressi ning default gw (mis on siis ISP poolne) aadressi jaoks.&lt;br /&gt;
Enne tegema hakkamist veendume, kas meie süsteemis on olemas utiliidid ip (reeglina pakis iproute või iproute2) ning iptables (reeglina pakis iptables). Juhul kui ei ole, tuleb need utiliidid paigaldada.&lt;br /&gt;
&lt;br /&gt;
Midagi, seadistame oma interfeisid.&lt;br /&gt;
Meie näites olgu eth0 sisevõrgu jaoks ning eth1 - eth3 olgu meie DSLidele.&lt;br /&gt;
Oletame, et sisevõrgu subnet on 192.168.2.0/24,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.1.0/30, kus 42.42.1.1 on meile antud aadress ning 42.42.1.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.2.0/30, kus 42.42.2.1 on meile antud aadress ning 42.42.2.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.3.0/30, kus 42.42.3.1 on meile antud aadress ning 42.42.3.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et sisevõrgus on meie masin aadressiga 192.168.2.254.&lt;br /&gt;
Kuidas iganes me neid interfeise ka ei seadista (see sõltub kasutatavast distributsioonist), oleks tulemus siis selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth0&lt;br /&gt;
 10: eth0: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 192.168.2.254/24 brd 192.168.2.255 scope global eth0&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth1&lt;br /&gt;
 11: eth1: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.1.1/30 brd 42.42.1.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth2&lt;br /&gt;
 12: eth2: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.2.1/30 brd 42.42.2.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip addr show dev eth3&lt;br /&gt;
 13: eth3: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
 inet 42.42.3.1/30 brd 42.42.3.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
Igaks juhuks vaatame ka routingu tabelit. See võiks välja näha selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip route&lt;br /&gt;
 192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.254&lt;br /&gt;
 42.42.1.0/30 dev eth1 proto kernel scope link src 42.42.1.1&lt;br /&gt;
 42.42.2.0/30 dev eth2 proto kernel scope link src 42.42.2.1&lt;br /&gt;
 42.42.3.0/30 dev eth3 proto kernel scope link src 42.42.3.1&lt;br /&gt;
 127.0.0.0/8 via 127.0.0.1 dev lo scope link&lt;br /&gt;
&lt;br /&gt;
Et aga igas enesest lugupidavas routingu tabelis võiks olla default route, siis valime mõne meie liinidest - näiteks kõige kiirema - ning lisame oma routingu tabelisse default route, näiteks: ip route add default via 42.42.3.2. Kindlasti tuleb meeles pidada, et ühes routingu tabelis saab olla ainult üks default route!!!&lt;br /&gt;
&lt;br /&gt;
Olles interfeisid ära seadistanud, kontrollime, kas kõik meile antud default gatewayde aadressid on pingitavad. Juhul kui on, rüüpame lonksu kohvi, õlut, veini, mahla.&lt;br /&gt;
&lt;br /&gt;
Edasi seisame me probleemi ees. Meile on antud kolm default gatewway aadressi, kuid me teame, et igas rotingu tabelis saab olla ainult üks default gateway. Mida teha? Õnneks saab Linuxis olla rohkem kui üks routingu tabel. Üldiselt tunneb Linux routingu tabeleid numbrite järgi, kuid kuna tegemist on ikkagi inimestele mõeldud süsteemiga, on võimalik nendele tabelitele ka nimesid panna. Uurime faili /etc/iproute2/rt_tables. See võiks välja näha umbes selline:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # cat /etc/iproute2/rt_tables&lt;br /&gt;
 #&lt;br /&gt;
 # reserved values&lt;br /&gt;
 #&lt;br /&gt;
 255 local&lt;br /&gt;
 254 main&lt;br /&gt;
 253 default&lt;br /&gt;
 0 unspec&lt;br /&gt;
 #&lt;br /&gt;
 # local&lt;br /&gt;
 #&lt;br /&gt;
 #1 inr.ruhep&lt;br /&gt;
&lt;br /&gt;
Number rea alguses märgib routingu tabeli numbrit, järgnev tekst selle nime, kõik, mis järgneb # sümbolile, on kommentaar. Trükkides käsureale ip route, näeme me &amp;quot;main&amp;quot; tabeli sisu. See on routingu tabel, mida vaikimisi kasutatakse, vt. üles. Jätame ta esialgu rahule, meil on vaja paika sättida oma kolm default gatewayd.&lt;br /&gt;
Teeme juurde kolm routingu tabelit, saagu nende numbriteks 10, 20 ja 30 ning nimedeks toru1, toru2 ja toru3. Selleks lisame faili /etc/iproute2/rt_tables järgmised read:&lt;br /&gt;
 10 toru1&lt;br /&gt;
 20 toru2&lt;br /&gt;
 30 toru3&lt;br /&gt;
Loomulikult on need tabelid tühjad, kirjutades käsureale näiteks ip route show table toru3, ei väljastata meile mitte midagi, kuid ei viriseta kaa - tabel on olemas, kuid ei sisalda ühtegi kirjet.&lt;br /&gt;
Mis seal siis ikka, täidame need tabelid, looma igasse routingu tabelisse ühe kirje - default route:&lt;br /&gt;
 &lt;br /&gt;
 ip route add default via 42.42.1.2 table toru1&lt;br /&gt;
 ip route add default via 42.42.2.2 table toru2&lt;br /&gt;
 ip route add default via 42.42.3.2 table toru3&lt;br /&gt;
&lt;br /&gt;
Vaatame, kas tuli välja, näiteks sedasi:&lt;br /&gt;
&lt;br /&gt;
 purk ~ # ip route show table toru3&lt;br /&gt;
 default via 42.42.3.2 dev eth3&lt;br /&gt;
&lt;br /&gt;
Nõndaks. Lonks õlut ning jätkame. Meil on terve hulk routingu tabeleid, igaüks oskab nendest kasutada mingit default gatewayd. Me peame kirjeldama mingid reeglid, mille alusel hakkab süsteem neid tabeleid pruukima. Et oleks lõbusam, oletame, et meie DSL liinid on erineva läbilaskevõimega, mistõttu me tahame, et neid läbiks erinev hulk liiklust. Olgu meil näiteks soov, et liiklus jaguneks liinide vahel järgmiselt: 20%, 30%, 50%. Me peame aru saama, et me ei saa suvaliselt igat n'ndat paketti saata ühe, teise või kolmanda liini peale. Peab olema selge, et kui ühenduse loomisel otsustati, et ühendus peab väljuma näiteks teist liini mööda, siis peavad kõik selle ühenduse juurde kuuluvad paketid seda teed käima - vastasel juhul ei saa välismaailmas olevad serverid mitte mütsigi aru, kes kellega siis lõpuks suhelda tahab. Et paketi kuuluvust ühenduse juurde saab üldiselt üheselt kindlaks teha vaid statefull protokollide korral, näiteks TCP, siis peavad kõik stateless ühendused käima &amp;quot;normaalset&amp;quot; teed mööda, meie näites siis põhiroutingutabeli järgi.&lt;br /&gt;
Selleks, et süsteem oskaks vahet teha, millise ühendusega on tegemist, peame me oma ühendusi kuidagi märgistama. Linuxis on selleks connmark. Connmark on selline &amp;quot;virtuaalne&amp;quot; märk, mida kannavad kõik vastavalt märgitud ühenduse juurde kuuluvad paketid, st. see märk eksisteerib _ainult_ tuuma sisemuses olevates tabelites, mitte pakettide endi payloadis (ehk siis, mitte segamini ajada TOS'iga).&lt;br /&gt;
&lt;br /&gt;
Kirjutame järgmised reeglid (eeldame siinkohal, et netfiltri kõik tabelid on tühjad):&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 20 -j MARK --set-mark 10&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 30 -j MARK --set-mark 20&lt;br /&gt;
 # iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 50 -j MARK --set-mark 30&lt;br /&gt;
&lt;br /&gt;
Nende reeglitega märgistame me keskmiselt 20% uutest ühendustest märgiga 10, 30% uutest ühendustest märgiga 20 ning 50% uutest ühendustest märgiga 30. Kindlasti tuleb märgistada ainult uusi ühendusi, sest märgistus on ühenduse põhine ning me ei taha, et ühenduse kestel keegi märgi üle kirjutaks. Samuti ei taha me märgistada ühendusi, mis luuakse meie purgist sisevõrgu poole, selleks kasutame välistavat tingimust -o !eth0 (loogiline, eks).&lt;br /&gt;
Edasi peame me kuidagi süsteemile ütlema, et erineva märgistusega pakettide korral tuleks kasutada erinevaid routingu tabeleid. Teeme järgmised reeglid:&lt;br /&gt;
&lt;br /&gt;
 # ip rule add fwmark 10 table toru1&lt;br /&gt;
 # ip rule add fwmark 20 table toru2&lt;br /&gt;
 # ip rule add fwmark 30 table toru3&lt;br /&gt;
Nende ridade tähendus peaks olema selge - me seome erinevad märgistused erinevate routingu tabelitega ning ütleme seega süsteemile, et kõiki pakette, mis kannavad märgistust 10, tuleb routida routingu tabeli toru1 abil, kõiki pakette, mis kannavad märgistust 20, toru2 abil ning märgistusega 30 pakette suunatakse tabelis toru3 sisalduva järgi.&lt;br /&gt;
Alati, kui me oleme routingu reeglites midagi muutnud, tuleb anda käsk: &lt;br /&gt;
&lt;br /&gt;
 # ip route flush cache&lt;br /&gt;
&lt;br /&gt;
Nimelt Linux, selleks, et ei peaks iga paketi peale routingu tabeleid läbi vaatama, ehitab omale sellise vahva route cache. On selge, et routingu reeglite muutmisel ei ole info cache'is enam korrektne, mistõttu tuleb sellele vesi peale tõmmata.&lt;br /&gt;
Juhul kui seda juba tehtud ei ole, siis on nüüd paras aeg ümber lülitada paar sysctl'i:&lt;br /&gt;
Lubame oma purgil pakette forwardida: &lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
&lt;br /&gt;
Keelame reverse path filtreerimise: &lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.ipv4.conf.all.rp_filter=0&lt;br /&gt;
&lt;br /&gt;
Mis siis sai... Meie süsteem omab hulka routingu tabeleid, oskab teatud tingimuste alusel pakette märgistada, oskab märgistuste alusel kasutada erinevaid routingu tabeleid. Jääb üle vaid ehitada NAT'i reeglid. Kirjutame järgmiselt:&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 42.42.1.1&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 42.42.2.1&lt;br /&gt;
 # iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 42.42.3.1&lt;br /&gt;
Ehk siis, pakettidel, mis tahavad väljuda eth1 kaudu (vastav otsus tehti routingu tabeli järgi enne POSTROUTING'usse jõudmist), muudetakse source aadressiks eth1 aadress, mis tahavad väljuda eth2 kaudu, eth2 aadress ning samuti ka eth3 puhul.&lt;br /&gt;
&lt;br /&gt;
Võikski kõik olla. Kindlasti tuleb meie setupi testida - näiteks istutades eth1-eth3 otsa tcpdumbi, tehes sisevõrgust ühendusi ning uurides, millist teed mööda need paketid siis lähevad. Debugimiseks võib netfiltri ahelatesse enne igat rida panna logivad reeglid, mille abil on siis võimalik näha, mis meie pakettidega juhtus.&lt;br /&gt;
Kuidagi tuleb ilmselt kirjutada skriptid, mis need seadistused süsteemi startupi ajal ära teevad, võib-olla ka miski tulemüüri funktsioon juurde ehitada... aga see on juba ilmselgelt teine teema.&lt;br /&gt;
&lt;br /&gt;
Ahjaa, küsite, et mis saab siis nendest pakettidest, mida mangle tabelis ei märgistatud ning mis saab juhul kui random/average jättis mõne paketi märkimata? Well.. ei saa suurt midagi - need paketid rouditakse &amp;quot;main&amp;quot; tabeli alusel (vt. main tabeli default gw.) ning natitakse vastavalt.&lt;br /&gt;
&lt;br /&gt;
Muide, kellele random ei meeldi ning tahab õiget round-robin load balancerit, peaks uurima &amp;quot;nth&amp;quot; moodulit, mis oskab matchida n'indale paketile X hulgast. Selle abil peaks pisukese kujutlusvõime korral round-robini realiseerimine üsna lihtne olema.&lt;br /&gt;
&lt;br /&gt;
Küsite, miks nii keeruliselt, kui ometi ütleb iptables'i manual SNAT'i kohta, et:&lt;br /&gt;
 You can add several --to-source options. If you specify more than one source address, either via an address range or multiple --to-source options, a &lt;br /&gt;
 simple round-robin (one after another in cycle) takes place between these adresses.&lt;br /&gt;
Jah, see on õige, kuid SNAT esineb ainult POSTROUTING ahelas, kuid selleks ajaks kui pakett jõuab POSTROUTING'usse, on routing decision juba tehtud ning seda enam muuta ei saa. Seega peame me oma load balanceri paigutama routing decisionist etepoole.&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
Kõik ülaltoodud näited on üsna sünteetilised. Mul puudub hetkel võimalus(tegelikult küll viitsimine) kirjeldatud olukorra läbi mängimiseks vajaliku testkeskkonna püsti püsti panekuks, mistõttu andestage võimalikud ebatäpsused.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rgukoormuse_jagaja_ehitamine&amp;diff=2684</id>
		<title>Lihtsa võrgukoormuse jagaja ehitamine</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rgukoormuse_jagaja_ehitamine&amp;diff=2684"/>
		<updated>2005-12-05T13:28:54Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lihtne load balaning juhuks kui soovitakse koormust mitme erineva internetiühenduse vahel jagada==&lt;br /&gt;
&lt;br /&gt;
Näites üritatakse koormust jagada KOLME erineva pakkuja välisühenduse vahel&lt;br /&gt;
&lt;br /&gt;
Koormuse jagamine kolme liini vahel (load balancing), mille puhul üks ühendus liigub küll ainult ühte liini mööda, kuid erinevad ühendused saavad kasutada erinevaid liine. On muidugi ilmselge, et niisuguse koormuse jagamise korral peavad tarbijad nägema internetti läbi NAT'i, samuti peab ilmselt eeldama, et sa ise mitte midagi ei serveeri.&lt;br /&gt;
&lt;br /&gt;
Ladna, meil on ilmselt olemas mingi purk, mida me hakkame kasutama oma interneti lüüsina. Et oleks ilus, võiks meil selle purgi küljes olla neli võrguinterfeissi - üks iga liini jaoks pluss üks sisevõrku, kuid paremal puudumisel saab ka kahega hakkama - DSLid peaks siis sellisel juhul ühenduma hubi või switchi kaudu. Purgiks sobib suvaline arvutav seade, mis on võimeline mõnd valge inimese OS'i jooksutama - meie kasutame oma näidetes Linuxit. Kui klassikaline pessukas liiga suur või mürarikas tundub, võib seda tööd vabalt teha ka OpenWRT'd jooksutav WRT54G.&lt;br /&gt;
&lt;br /&gt;
Kahjuks on aga nõnda, et tavaline linuxi tuum ei sisalda ühtegi antud olukorras kasutamiseks ühtegi mõistlikku netfiltri moodulit load balancingu tegemiseks. Võib vabalt olla, et mõnede distributsioonide tuumad sisaldavad juba neid mooduleid, vastasel juhul on vajalik oma tuuma patchida. Netfiltri projekt üllitab perioodiliselt patch-o-matic nimelisi pakke, tasub sikutada nendest viimane ning lasta tuuma vähemalt allpool kasutatud &amp;quot;random&amp;quot; patch, kuid huvi võiks pakkuda ka &amp;quot;nth&amp;quot; patch. Kuidas tuuma paigatakse, peab igaüks ise teadma, sest see väljub pisut antud teemast. Võib-olla saab abi Linuxi foorumist, kuid ma isiklikult soovitan google abil juhendeid otsida. Igaljuhul me eeldame, et vähemalt &amp;quot;random&amp;quot; patch on tuumas sees.&lt;br /&gt;
&lt;br /&gt;
Oleme oma DSLi modemid ära ühendanud. Lihtsuse huvides eeldame, et kõik DSLid on staatilise IP aadressiga ning ei vaja meie poolset PPPoE seadistust.&lt;br /&gt;
Meil on kolm subneti. tavaliselt on neex x.x.x.x/30, kus on ruumi meie masina aadressi ning default gw (mis on siis ISP poolne) aadressi jaoks.&lt;br /&gt;
Enne tegema hakkamist veendume, kas meie süsteemis on olemas utiliidid ip (reeglina pakis iproute või iproute2) ning iptables (reeglina pakis iptables). Juhul kui ei ole, tuleb need utiliidid paigaldada.&lt;br /&gt;
&lt;br /&gt;
Midagi, seadistame oma interfeisid.&lt;br /&gt;
Meie näites olgu eth0 sisevõrgu jaoks ning eth1 - eth3 olgu meie DSLidele.&lt;br /&gt;
Oletame, et sisevõrgu subnet on 192.168.2.0/24,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.1.0/30, kus 42.42.1.1 on meile antud aadress ning 42.42.1.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.2.0/30, kus 42.42.2.1 on meile antud aadress ning 42.42.2.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et eth1 küljes olev subnet on 42.42.3.0/30, kus 42.42.3.1 on meile antud aadress ning 42.42.3.2 on default gw selle liini jaoks,&lt;br /&gt;
oletame, et sisevõrgus on meie masin aadressiga 192.168.2.254.&lt;br /&gt;
Kuidas iganes me neid interfeise ka ei seadista (see sõltub kasutatavast distributsioonist), oleks tulemus siis selline:&lt;br /&gt;
&lt;br /&gt;
purk ~ # ip addr show dev eth0&lt;br /&gt;
10: eth0: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
inet 192.168.2.254/24 brd 192.168.2.255 scope global eth0&lt;br /&gt;
&lt;br /&gt;
purk ~ # ip addr show dev eth1&lt;br /&gt;
11: eth1: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
inet 42.42.1.1/30 brd 42.42.1.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
purk ~ # ip addr show dev eth2&lt;br /&gt;
12: eth2: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
inet 42.42.2.1/30 brd 42.42.2.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
purk ~ # ip addr show dev eth3&lt;br /&gt;
13: eth3: &amp;lt;BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
inet 42.42.3.1/30 brd 42.42.3.3 scope global eth1&lt;br /&gt;
&lt;br /&gt;
Igaks juhuks vaatame ka routingu tabelit. See võiks välja näha selline:&lt;br /&gt;
&lt;br /&gt;
purk ~ # ip route&lt;br /&gt;
192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.254&lt;br /&gt;
42.42.1.0/30 dev eth1 proto kernel scope link src 42.42.1.1&lt;br /&gt;
42.42.2.0/30 dev eth2 proto kernel scope link src 42.42.2.1&lt;br /&gt;
42.42.3.0/30 dev eth3 proto kernel scope link src 42.42.3.1&lt;br /&gt;
127.0.0.0/8 via 127.0.0.1 dev lo scope link&lt;br /&gt;
&lt;br /&gt;
Et aga igas enesest lugupidavas routingu tabelis võiks olla default route, siis valime mõne meie liinidest - näiteks kõige kiirema - ning lisame oma routingu tabelisse default route, näiteks: ip route add default via 42.42.3.2. Kindlasti tuleb meeles pidada, et ühes routingu tabelis saab olla ainult üks default route!!!&lt;br /&gt;
&lt;br /&gt;
Olles interfeisid ära seadistanud, kontrollime, kas kõik meile antud default gatewayde aadressid on pingitavad. Juhul kui on, rüüpame lonksu kohvi, beer_yum.gift, veini, mahla.&lt;br /&gt;
&lt;br /&gt;
Edasi seisame me probleemi ees. Meile on antud kolm default gatewway aadressi, kuid me teame, et igas rotingu tabelis saab olla ainult üks default gateway. Mida teha? Õnneks saab Linuxis olla rohkem kui üks routingu tabel. Üldiselt tunneb Linux routingu tabeleid numbrite järgi, kuid kuna tegemist on ikkagi inimestele mõeldud süsteemiga, on võimalik nendele tabelitele ka nimesid panna. Uurime faili /etc/iproute2/rt_tables. See võiks välja näha umbes selline:&lt;br /&gt;
&lt;br /&gt;
purk ~ # cat /etc/iproute2/rt_tables&lt;br /&gt;
#&lt;br /&gt;
# reserved values&lt;br /&gt;
#&lt;br /&gt;
255 local&lt;br /&gt;
254 main&lt;br /&gt;
253 default&lt;br /&gt;
0 unspec&lt;br /&gt;
#&lt;br /&gt;
# local&lt;br /&gt;
#&lt;br /&gt;
#1 inr.ruhep&lt;br /&gt;
&lt;br /&gt;
Number rea alguses märgib routingu tabeli numbrit, järgnev tekst selle nime, kõik, mis järgneb # sümbolile, on kommentaar. Trükkides käsureale ip route, näeme me &amp;quot;main&amp;quot; tabeli sisu. See on routingu tabel, mida vaikimisi kasutatakse, vt. üles. Jätame ta esialgu rahule, meil on vaja paika sättida oma kolm default gatewayd.&lt;br /&gt;
Teeme juurde kolm routingu tabelit, saagu nende numbriteks 10, 20 ja 30 ning nimedeks toru1, toru2 ja toru3. Selleks lisame faili /etc/iproute2/rt_tables järgmised read:&lt;br /&gt;
10 toru1&lt;br /&gt;
20 toru2&lt;br /&gt;
30 toru3&lt;br /&gt;
Loomulikult on need tabelid tühjad, kirjutades käsureale näiteks ip route show table toru3, ei väljastata meile mitte midagi, kuid ei viriseta kaa - tabel on olemas, kuid ei sisalda ühtegi kirjet.&lt;br /&gt;
Mis seal siis ikka, täidame need tabelid, looma igasse routingu tabelisse ühe kirje - default route:&lt;br /&gt;
ip route add default via 42.42.1.2 table toru1&lt;br /&gt;
ip route add default via 42.42.2.2 table toru2&lt;br /&gt;
ip route add default via 42.42.3.2 table toru3&lt;br /&gt;
&lt;br /&gt;
Vaatame, kas tuli välja, näiteks sedasi:&lt;br /&gt;
&lt;br /&gt;
purk ~ # ip route show table toru3&lt;br /&gt;
default via 42.42.3.2 dev eth3&lt;br /&gt;
&lt;br /&gt;
Nõndaks. Lonks beer_yum.gift ning jätkame. Meil on terve hulk routingu tabeleid, igaüks oskab nendest kasutada mingit default gatewayd. Me peame kirjeldama mingid reeglid, mille alusel hakkab süsteem neid tabeleid pruukima. Et oleks lõbusam, oletame, et meie DSL liinid on erineva läbilaskevõimega, mistõttu me tahame, et neid läbiks erinev hulk liiklust. Olgu meil näiteks soov, et liiklus jaguneks liinide vahel järgmiselt: 20%, 30%, 50%. Me peame aru saama, et me ei saa suvaliselt igat n'ndat paketti saata ühe, teise või kolmanda liini peale. Peab olema selge, et kui ühenduse loomisel otsustati, et ühendus peab väljuma näiteks teist liini mööda, siis peavad kõik selle ühenduse juurde kuuluvad paketid seda teed käima - vastasel juhul ei saa välismaailmas olevad serverid mitte mütsigi aru, kes kellega siis lõpuks suhelda tahab. Et paketi kuuluvust ühenduse juurde saab üldiselt üheselt kindlaks teha vaid statefull protokollide korral, näiteks TCP, siis peavad kõik stateless ühendused käima &amp;quot;normaalset&amp;quot; teed mööda, meie näites siis põhiroutingutabeli järgi.&lt;br /&gt;
Selleks, et süsteem oskaks vahet teha, millise ühendusega on tegemist, peame me oma ühendusi kuidagi märgistama. Linuxis on selleks connmark. Connmark on selline &amp;quot;virtuaalne&amp;quot; märk, mida kannavad kõik vastavalt märgitud ühenduse juurde kuuluvad paketid, st. see märk eksisteerib _ainult_ tuuma sisemuses olevates tabelites, mitte pakettide endi payloadis (ehk siis, mitte segamini ajada TOS'iga).&lt;br /&gt;
&lt;br /&gt;
Kirjutame järgmised reeglid (eeldame siinkohal, et netfiltri kõik tabelid on tühjad):&lt;br /&gt;
# iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 20 -j MARK --set-mark 10&lt;br /&gt;
# iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 30 -j MARK --set-mark 20&lt;br /&gt;
# iptables -t mangle -A PREROUTING -o !eth0 -p tcp -m state --state NEW -m random --average 50 -j MARK --set-mark 30&lt;br /&gt;
&lt;br /&gt;
Nende reeglitega märgistame me keskmiselt 20% uutest ühendustest märgiga 10, 30% uutest ühendustest märgiga 20 ning 50% uutest ühendustest märgiga 30. Kindlasti tuleb märgistada ainult uusi ühendusi, sest märgistus on ühenduse põhine ning me ei taha, et ühenduse kestel keegi märgi üle kirjutaks. Samuti ei taha me märgistada ühendusi, mis luuakse meie purgist sisevõrgu poole, selleks kasutame välistavat tingimust -o !eth0 (loogiline, eks).&lt;br /&gt;
Edasi peame me kuidagi süsteemile ütlema, et erineva märgistusega pakettide korral tuleks kasutada erinevaid routingu tabeleid. Teeme järgmised reeglid:&lt;br /&gt;
&lt;br /&gt;
# ip rule add fwmark 10 table toru1&lt;br /&gt;
# ip rule add fwmark 20 table toru2&lt;br /&gt;
# ip rule add fwmark 30 table toru3&lt;br /&gt;
Nende ridade tähendus peaks olema selge - me seome erinevad märgistused erinevate routingu tabelitega ning ütleme seega süsteemile, et kõiki pakette, mis kannavad märgistust 10, tuleb routida routingu tabeli toru1 abil, kõiki pakette, mis kannavad märgistust 20, toru2 abil ning märgistusega 30 pakette suunatakse tabelis toru3 sisalduva järgi.&lt;br /&gt;
Alati, kui me oleme routingu reeglites midagi muutnud, tuleb anda käsk: # ip route flush cache&lt;br /&gt;
Nimelt Linux, selleks, et ei peaks iga paketi peale routingu tabeleid läbi vaatama, ehitab omale sellise vahva route cache. On selge, et routingu reeglite muutmisel ei ole info cache'is enam korrektne, mistõttu tuleb sellele vesi peale tõmmata.&lt;br /&gt;
Juhul kui seda juba tehtud ei ole, siis on nüüd paras aeg ümber lülitada paar sysctl'i:&lt;br /&gt;
Lubame oma purgil pakette forwardida: # sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
Keelame reverse path filtreerimise: # sysctl -w net.ipv4.conf.all.rp_filter=0&lt;br /&gt;
&lt;br /&gt;
Mis siis sai... Meie süsteem omab hulka routingu tabeleid, oskab teatud tingimuste alusel pakette märgistada, oskab märgistuste alusel kasutada erinevaid routingu tabeleid. Jääb üle vaid ehitada NAT'i reeglid. Kirjutame järgmiselt:&lt;br /&gt;
# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 42.42.1.1&lt;br /&gt;
# iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 42.42.2.1&lt;br /&gt;
# iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 42.42.3.1&lt;br /&gt;
Ehk siis, pakettidel, mis tahavad väljuda eth1 kaudu (vastav otsus tehti routingu tabeli järgi enne POSTROUTING'usse jõudmist), muudetakse source aadressiks eth1 aadress, mis tahavad väljuda eth2 kaudu, eth2 aadress ning samuti ka eth3 puhul.&lt;br /&gt;
&lt;br /&gt;
Võikski kõik olla. Kindlasti tuleb meie setupi testida - näiteks istutades eth1-eth3 otsa tcpdumbi, tehes sisevõrgust ühendusi ning uurides, millist teed mööda need paketid siis lähevad. Debugimiseks võib netfiltri ahelatesse enne igat rida panna logivad reeglid, mille abil on siis võimalik näha, mis meie pakettidega juhtus.&lt;br /&gt;
Kuidagi tuleb ilmselt kirjutada skriptid, mis need seadistused süsteemi startupi ajal ära teevad, võib-olla ka miski tulemüüri funktsioon juurde ehitada... aga see on juba ilmselgelt teine teema.&lt;br /&gt;
&lt;br /&gt;
Ahjaa, küsite, et mis saab siis nendest pakettidest, mida mangle tabelis ei märgistatud ning mis saab juhul kui random/average jättis mõne paketi märkimata? Well.. ei saa suurt midagi - need paketid rouditakse &amp;quot;main&amp;quot; tabeli alusel (vt. main tabeli default gw.) ning natitakse vastavalt.&lt;br /&gt;
&lt;br /&gt;
Muide, kellele random ei meeldi ning tahab õiget round-robin load balancerit, peaks uurima &amp;quot;nth&amp;quot; moodulit, mis oskab matchida n'indale paketile X hulgast. Selle abil peaks pisukese kujutlusvõime korral round-robini realiseerimine üsna lihtne olema.&lt;br /&gt;
&lt;br /&gt;
Küsite, miks nii keeruliselt, kui ometi ütleb iptables'i manual SNAT'i kohta, et:&lt;br /&gt;
You can add several --to-source options. If you specify more than one source address, either via an address range or multiple --to-source options, a simple round-robin (one after another in cycle) takes place between these adresses.&lt;br /&gt;
Jah, see on õige, kuid SNAT esineb ainult POSTROUTING ahelas, kuid selleks ajaks kui pakett jõuab POSTROUTING'usse, on routing decision juba tehtud ning seda enam muuta ei saa. Seega peame me oma load balanceri paigutama routing decisionist etepoole.&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
Kõik ülaltoodud näited on üsna sünteetilised. Mul puudub hetkel võimalus(tegelikult küll viitsimine) kirjeldatud olukorra läbi mängimiseks vajaliku testkeskkonna püsti püsti panekuks, mistõttu andestage võimalikud ebatäpsused.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=QoS&amp;diff=2683</id>
		<title>QoS</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=QoS&amp;diff=2683"/>
		<updated>2005-12-05T13:07:27Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Kasulikud Näpunäited]]&lt;br /&gt;
[[Kategooria:Andmeside]]&lt;br /&gt;
[[Kategooria:Võrgukihi juhendid]]&lt;br /&gt;
==QoS, ehk siis Quality Of Service, või siis maakeeli Kunst, Kuidas Teha Kõik Õnnelikuks[tm].==&lt;br /&gt;
===Mis on QoS ehk kuidas ohjeldada netti ummistavat naabrimeest kui võrgu jagamisest loobuda ei saa?===&lt;br /&gt;
Nimelt on võimalik pakette, mida tahetakse seadmest välja saata, mingite reeglite alusel ümber järjestada, &amp;quot;kinni hoida&amp;quot; ning järjekorrast kustutada. Seega on vähemalt teoreetiliselt võimalik naabrimehe &amp;quot;pahade&amp;quot; ühenduste juure kuuluvaid pakette valikuliselt viivitada või minema visata, et naabrimehe aplikatsioonile jätta mulje, et liin on koormatud, mille tulemusel ei saa naabrimehe aplikatsioon enam võrguressurssi raisata.&lt;br /&gt;
TCP ühenduste puhul on see (teoorias) lihtne, kuna TCP puhul peab üks pool iga vastu võetud paketi kohta saatma teisele poolele kinnituse, et see konkreetne pakett saadi kätte (jah ma tean küll, et piisavalt suure akna puhul on võimalik saata ka rohkem kui üks pakett ilma kinnitust saamata, kuid see ei ole antud hetkel eriti tähtis).&lt;br /&gt;
Ning ongi sedasi, et kui me viivitame oma võrku jagavas seadmes naabrimehe &amp;quot;pahade&amp;quot; ühenduste juurde kuuluvaid pakette natukene, on meil endil selle aja jooksul võimalik vastu võtta teisi pakette, sest naabrimehele filmikest saatev server ootab kuni naabrimees on juba saadetud paketide kättesaamist kinnitanud.&lt;br /&gt;
Sellisel moel saab naabrimehe teatud ühenduste jaoks kehtestada statistilise ribalaiuse limiidi - väga palju jääb näiteks võrguressurssi üle kui naabrimehele kehtestatud statistiline ribalaiuse limiit failisikutamiseks on 9600 bps.&lt;br /&gt;
Samuti on võimalik teatud pakette (näiteks selliseid, mis kuuluvad mõne ajakriitilise ühenduse juurde) järjekorras teistest ettepoole tõsta.&lt;br /&gt;
&lt;br /&gt;
Küsite, kas ei saaks ka näiteks sedasi, et määrata hoopis ühendused, mis on olulised, ning panna nad kuidagi eelisjärjekorda?&lt;br /&gt;
Kuna me saame QoS'i teha ainult väljumisel ning kuna suurem osa liiklust tuleb tavaliselt meie juurde sisse, mistõttu on pudelikaelaks meie ja ISP vaheline ühendus, siis üldiselt ei saa - seda peaks tegema ISP.&lt;br /&gt;
&lt;br /&gt;
Pealtnäha on kõik hästi lihtne, eks?&lt;br /&gt;
Tegelikult on QoS äärmiselt raske ja keerukas teema. Keerukaks teeb selle kolm probleemi: kuidas valida antud olukorra jaoks õige scheduler, kuidas märkida pakette ühte või teise klassi kuuluvaks ning kuidas need klassid siis lõppeks üksteisesse suhtuma peaks.&lt;br /&gt;
Kui lihtsamaid ülesandeid, näiteks IP aadressi või võrguseadme pordi põhiselt ribalaiuse limiteerimist saab &amp;quot;kasutajasõbralike kasutajaliidestega&amp;quot; seadmete abil teha ka ilma eriti sügavate teadmisteta sellest, mis tegelikult võrgus toimub, siis keerukamad ülesanded, näiteks FTP sessiooni piiramine või suisa P2P sessioonide piiramine, VoIP'ist rääkimata, ei ole kindlasti algajale jõukohased.&lt;br /&gt;
&lt;br /&gt;
Author wookie&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=QoS&amp;diff=2682</id>
		<title>QoS</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=QoS&amp;diff=2682"/>
		<updated>2005-12-05T13:05:47Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==QoS, ehk siis Quality Of Service, või siis maakeeli Kunst, Kuidas Teha Kõik Õnnelikuks[tm].==&lt;br /&gt;
===Mis on QoS ehk kuidas ohjeldada netti ummistavat naabrimeest kui võrgu jagamisest loobuda ei saa?===&lt;br /&gt;
Nimelt on võimalik pakette, mida tahetakse seadmest välja saata, mingite reeglite alusel ümber järjestada, &amp;quot;kinni hoida&amp;quot; ning järjekorrast kustutada. Seega on vähemalt teoreetiliselt võimalik naabrimehe &amp;quot;pahade&amp;quot; ühenduste juure kuuluvaid pakette valikuliselt viivitada või minema visata, et naabrimehe aplikatsioonile jätta mulje, et liin on koormatud, mille tulemusel ei saa naabrimehe aplikatsioon enam võrguressurssi raisata.&lt;br /&gt;
TCP ühenduste puhul on see (teoorias) lihtne, kuna TCP puhul peab üks pool iga vastu võetud paketi kohta saatma teisele poolele kinnituse, et see konkreetne pakett saadi kätte (jah ma tean küll, et piisavalt suure akna puhul on võimalik saata ka rohkem kui üks pakett ilma kinnitust saamata, kuid see ei ole antud hetkel eriti tähtis).&lt;br /&gt;
Ning ongi sedasi, et kui me viivitame oma võrku jagavas seadmes naabrimehe &amp;quot;pahade&amp;quot; ühenduste juurde kuuluvaid pakette natukene, on meil endil selle aja jooksul võimalik vastu võtta teisi pakette, sest naabrimehele filmikest saatev server ootab kuni naabrimees on juba saadetud paketide kättesaamist kinnitanud.&lt;br /&gt;
Sellisel moel saab naabrimehe teatud ühenduste jaoks kehtestada statistilise ribalaiuse limiidi - väga palju jääb näiteks võrguressurssi üle kui naabrimehele kehtestatud statistiline ribalaiuse limiit failisikutamiseks on 9600 bps.&lt;br /&gt;
Samuti on võimalik teatud pakette (näiteks selliseid, mis kuuluvad mõne ajakriitilise ühenduse juurde) järjekorras teistest ettepoole tõsta.&lt;br /&gt;
&lt;br /&gt;
Küsite, kas ei saaks ka näiteks sedasi, et määrata hoopis ühendused, mis on olulised, ning panna nad kuidagi eelisjärjekorda?&lt;br /&gt;
Kuna me saame QoS'i teha ainult väljumisel ning kuna suurem osa liiklust tuleb tavaliselt meie juurde sisse, mistõttu on pudelikaelaks meie ja ISP vaheline ühendus, siis üldiselt ei saa - seda peaks tegema ISP.&lt;br /&gt;
&lt;br /&gt;
Pealtnäha on kõik hästi lihtne, eks?&lt;br /&gt;
Tegelikult on QoS äärmiselt raske ja keerukas teema. Keerukaks teeb selle kolm probleemi: kuidas valida antud olukorra jaoks õige scheduler, kuidas märkida pakette ühte või teise klassi kuuluvaks ning kuidas need klassid siis lõppeks üksteisesse suhtuma peaks.&lt;br /&gt;
Kui lihtsamaid ülesandeid, näiteks IP aadressi või võrguseadme pordi põhiselt ribalaiuse limiteerimist saab &amp;quot;kasutajasõbralike kasutajaliidestega&amp;quot; seadmete abil teha ka ilma eriti sügavate teadmisteta sellest, mis tegelikult võrgus toimub, siis keerukamad ülesanded, näiteks FTP sessiooni piiramine või suisa P2P sessioonide piiramine, VoIP'ist rääkimata, ei ole kindlasti algajale jõukohased.&lt;br /&gt;
&lt;br /&gt;
Author wookie&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2654</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2654"/>
		<updated>2005-11-29T18:09:17Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Muutujate hilistatud väärtustamine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtusena ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2653</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2653"/>
		<updated>2005-11-29T18:08:36Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Muutujate hilistatud väärtustamine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*CMD ja COMMAND süntaks on erakordselt jube ja kultiveerib erakordselt halbu programeerimisharjumusi (eeldefineerimata muutujate kasutamine, tüübistamata muutujad, GOTO kasutamine jne.) Teid on hoiatatud! &lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 vms. Samuti on CMD skript abiks Windows Active Directory administreerimisel. Microsoft ise soovitab selleks otstarbeks kasutada Windows Scripting Host interpretaatorile kirjutatud VBScripti, kuid siin on yks pisikene &amp;quot;AGA&amp;quot;. Vahel on tarvis kõikides domeeni kuuluvates masinates jooksutada mingeid käske kellegi kõvema kui kasutaja õigustes. Selle jaoks pakub AD võimalust jooksutada skripte arvuti käivitamisel lokaalse kasutaja SYSTEM õigustes. Paraku - startupi ajal pole Windows Scripting Host veel laetud ja meil puudub keskkond/interpretaator VBScritpi täitmiseks. Kasutada saame CMD skripte. CMD/BAT skripti on ka lihtne muuta. Teda ei kompileerita kunagi - igal täitmisel loeb interpretaator skritpi rea kaupa, tõlgib rea &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;br /&gt;
&lt;br /&gt;
===Rekursiivne DIR===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 FOR /F &amp;quot;tokens=1 delims=-&amp;gt;&amp;quot; %A IN ('xcopy /L /F /E /S /H /R /C /Y *.* %TEMP%') do echo %A &lt;br /&gt;
For tsükkel on vajalik selleks, et xcopy väljundist kujul &amp;lt;tt&amp;gt;source -&amp;gt; destination&amp;lt;/tt&amp;gt; eemadalda meie jaos mittevajalik &amp;quot;destination&amp;quot; osa.&lt;br /&gt;
Huvitavaid lisavõimalusi pakub xcopy võti /D millega saab otsingule seada alampiiri, millest ajaliselt vanemaid faile ignoreeritakse. &lt;br /&gt;
Xcopy käsu &amp;quot;destinationiks&amp;quot; sobib MISTAHES relaaselt eksisteeriv kataloog.&lt;br /&gt;
&lt;br /&gt;
===Muutujate hilistatud väärtustamine===&lt;br /&gt;
&lt;br /&gt;
CMD interpretaatoril on jabur komme asendada muutjad nende väärtustega, mitte siis, kui koodirida täidetakse vaid siis kui rida interpreteerimiseks ja täitmiseks mällu loetakse. Tegelikult on võimalik sundida CMD-d käituma &amp;quot;päris&amp;quot; interpretaatorite moodi - muutujad asendadatakse nende väärtustega interpreteerimise käigus. Paraku ei ole Microsofti programeerijad suutnud vastavat algoritmi korralikult implementeerida ja &amp;quot;hilistatud väärtustamise&amp;quot; rezhiimis on koodi täitmine väga aeglane. Seetõttu on see võimalus vaikimisi välja lülitatud. Sisse on seda võimalik lülitada, kutsudes CMD välja võtmega /V&lt;br /&gt;
 CMD /V:ON&lt;br /&gt;
Jäigalt saab hilistatud väärtustamise sisse lülitada muutes registry võtmete&lt;br /&gt;
 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(süsteemselt) või&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion&lt;br /&gt;
(kasutajapõhiselt) väärtust 0x0 (disabled) või 0x1 (enabled)&lt;br /&gt;
Viimane tegevus pole siiski soovitav, sest nagu öeldud - skripti interpreteerimine muutub KORDADES aeglasemaks. Hilistatud väärtustamise kasutamiseks on mõtekas võtmega /V:ON välja kutusuda alamshell ja tulemused tagastada failis (alamshell ei päranda muutujaid vanemale!).&lt;br /&gt;
&lt;br /&gt;
Vaatleme niisugust näidet:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=%LIST% %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
Tundub, et meie muutuja &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; väärtuseks peaks saama jooksvas kataloogis asuvate failide nimekiri. Ometi näeme me muutjas &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; sees ainult viimast leitud faili. Miks? Sest CMD väärtustab &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; FOR-tsükli lugemisel (sel hetkel sisaldab see tühja väärtust), mitte täitmisel.&lt;br /&gt;
Meil oleks tarvis, et &amp;lt;tt&amp;gt;%LIST%&amp;lt;/tt&amp;gt; saaks väärtuse FOR-tsükli IGAL täitmisel. Siin tulebki appi hilistatud väärtustamise rezhiim:&lt;br /&gt;
&amp;lt;br&amp;gt;CMD /V:ON&lt;br /&gt;
 set LIST=&lt;br /&gt;
 for %i in (*) do set LIST=!LIST! %i&lt;br /&gt;
 echo %LIST%&lt;br /&gt;
See skript annab juba oodatud tulemuse. Paneme tähele, et lisaks sellele, et meil on interpretaator vaja välja kutsuda õige võtmega, tuleb ka &amp;quot;hilistatud&amp;quot; muutuja välja kutsuda teist moodi kui &amp;quot;tavaline&amp;quot; muutuja -- &amp;lt;tt&amp;gt;!LIST!&amp;lt;/tt&amp;gt;&lt;br /&gt;
Hilistatud muutujaid kasutatakse siis kui &amp;lt;tt&amp;gt;IF-(foo)&amp;lt;/tt&amp;gt; või &amp;lt;tt&amp;gt;FOR-DO&amp;lt;/tt&amp;gt; skoobis on tarvilik väärtustada muutuja ja muutuja väärtust samas skoobis uuesti kasutada.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2632</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2632"/>
		<updated>2005-11-25T10:33:25Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Kataloog ehk appi ma olen eksinud */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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! &lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2631</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2631"/>
		<updated>2005-11-25T10:33:08Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Kataloog ehk appi ma olen eksinud */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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! &lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;br /&gt;
&amp;lt;br&amp;gt;META CMD&lt;br /&gt;
 PUSHD \\foo\bar&lt;br /&gt;
 ECHO %CD%&lt;br /&gt;
 POPD&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2630</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2630"/>
		<updated>2005-11-25T10:31:33Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Kataloog ehk appi ma olen eksinud */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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! &lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed. POPD vabastab monteeringu).&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2629</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2629"/>
		<updated>2005-11-25T10:31:17Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Kataloog ehk appi ma olen eksinud */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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! &lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
&amp;lt;br&amp;gt;CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed POPD vabastab monteeringu).&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2628</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2628"/>
		<updated>2005-11-25T10:30:32Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Nipid ja Trikid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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! &lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;br /&gt;
&lt;br /&gt;
===Kataloog ehk appi ma olen eksinud===&lt;br /&gt;
Jooksvat kataloogi säilitatakse muutujas %cd%&lt;br /&gt;
CMD&lt;br /&gt;
 echo %cd%&lt;br /&gt;
Seame töökataloogiks oma valitud kataloogi ja pärast skripti töö lõppu pöördume tagasi jooksvasse kataloogi&lt;br /&gt;
META CMD&lt;br /&gt;
 PUSHD %SYSTEMROOT%&lt;br /&gt;
 ECHO %CD% &lt;br /&gt;
 POPD&lt;br /&gt;
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 &amp;quot;klassikalist&amp;quot; teed POPD vabastab monteeringu).&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2627</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2627"/>
		<updated>2005-11-25T10:17:52Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Sissejuhatus ja tavapärane disklaimer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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! &lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2626</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2626"/>
		<updated>2005-11-25T10:10:19Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Kuidas tekitada tühja faili */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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! &lt;br /&gt;
&lt;br /&gt;
*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. 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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
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 &amp;quot;must auk&amp;quot;. Erinevalt looduslikust &amp;quot;mustast august&amp;quot;, 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: &amp;quot;mittemidagi, mida ma sulle ei anna, sai siinkohas otsa, seega paneme faili nüüd viisakalt kinni&amp;quot;. Õnneks see ongi täpselt see mida meil vaja on.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2625</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2625"/>
		<updated>2005-11-25T10:04:47Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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! &lt;br /&gt;
&lt;br /&gt;
*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. 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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus &amp;lt;tt&amp;gt;0x0D 0x0A&amp;lt;tt&amp;gt;.&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
Nüüd saame me tõesti tühja faili. Paar sõna selgituseks:&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2624</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2624"/>
		<updated>2005-11-25T09:56:09Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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! &lt;br /&gt;
&lt;br /&gt;
*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. Näidetes leiduvad foo ja bar on üldlevinud tähistus vabalt valitud nimega failide, muutujate, alamprotseduuride jms. kohta.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;br /&gt;
&lt;br /&gt;
===Kuidas tekitada tühja faili===&lt;br /&gt;
&lt;br /&gt;
Enamasti kasutatakse selleks umbes niisugust rida:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 echo. &amp;gt; foo.bar&lt;br /&gt;
Tegelikult annab see rida väära st. ülesande tingimustega kokkusobimatu tulemuse, kuna silma järgi tyhjas failis on tegelikult yks reavahetus 0x0D 0x0A&lt;br /&gt;
Õige tulemuse annab niisugune kood:&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 copy NUL foo.bar&lt;br /&gt;
Nüüd saame me tõesti tühja faili. Paar sõna selgituseks:&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2623</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2623"/>
		<updated>2005-11-25T09:38:30Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;All hope abandon, ye who enter here!&amp;quot;''&lt;br /&gt;
&amp;lt;br&amp;gt;Dante Alighieri, The Divine Comedy&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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! &lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2622</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2622"/>
		<updated>2005-11-25T09:29:10Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke==&lt;br /&gt;
&lt;br /&gt;
===Sissejuhatus ja tavapärane disklaimer===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*Kui Sa oled programeerimises täielik algaja, siis PALUN ära ürita selle juhendi järgi skriptima õppida. CMD ja COMMAND süntaks on &lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
====COMMAND.COM====&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====CMD.EXE====&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
====Millal on otstarbekas käsuskripte kasutada.==== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;br /&gt;
&lt;br /&gt;
==Nipid ja Trikid==&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2620</id>
		<title>CMD ja BAT - nipid ja trikid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=CMD_ja_BAT_-_nipid_ja_trikid&amp;diff=2620"/>
		<updated>2005-11-24T18:48:27Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
===CMD.EXE ja COMMAND.COM interpretaatoritele skriptimise nippe ja trikke===&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
*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.&lt;br /&gt;
&lt;br /&gt;
==COMMAND.COM==&lt;br /&gt;
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. &amp;quot;batch&amp;quot; rezhiimis.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==CMD.EXE==&lt;br /&gt;
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 &amp;quot;DOSi käskudeks&amp;quot;. 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 &amp;quot;batch&amp;quot; rezhiimis. CMD käsuskripti laiendina on soovitav kasutada .CMD, siis teab süsteem, et skripti interpreteerimiseks tuleks kindlasti kasutada CMD.EXE interpretaatorit. &lt;br /&gt;
CMD laiendatud võimalused, olgugi napid, annavad juba lihtsama interpreteeriva programeerimiskeele võimekuse välja.&lt;br /&gt;
&lt;br /&gt;
==MILLAL on otstarbekas käsuskripte kasutada.== Ilmselt siis kui me soovime automatiseerida mõnda lihtsamat korduvat tegevust, mille jaoks pole mõtet hakata &amp;quot;päris&amp;quot; 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 &amp;quot;masinakeelde&amp;quot;, täidab ja väljastab tulemuse.&lt;br /&gt;
&lt;br /&gt;
Sissejuhatuse lõpetuseks veel klassikaline näiteprogramm&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
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 &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;br&amp;gt;COMMAND&lt;br /&gt;
 REM @ECHO OFF&lt;br /&gt;
 ECHO Hello World&lt;br /&gt;
REM on lühend inglise keelsest sõnast REMARK ja tähistab kommentaari.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2606</id>
		<title>Sissejuhatus programmeerimisse</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2606"/>
		<updated>2005-11-23T19:31:47Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Mõisted */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
== Programmeerimine ==&lt;br /&gt;
&lt;br /&gt;
Mis on programmeerimine? Programmide loomine? Jah, nii võiks ta kokku võtta küll, ent tegelikkuses ei ole asi sugugi nii lilleline ning keerulisemate programmide tegemine võib võtta aega päevadest aastateni. Suuremad programmid koosnevad miljonitest (kui mitte miljarditest) ridadest koodist ning neid on arendatud aasta(kümne)id.&lt;br /&gt;
&lt;br /&gt;
Programmeerimine koosneb tegelikult paljudest staadiumitest. Tõsi, on võimalik võtta pähe, et „oh, ma nüüd lähen ja teen kohe programmi,” ent kui tõsisemaseks programmeerimiseks läheb, siis sellisest mõtteviisist ei piisa. Programmide loomise mõned etapid on näiteks ideestaadium, disainistaadium, projekteerimise staadium ja siis tuleb alles koodimise osa.&lt;br /&gt;
&lt;br /&gt;
Lisaks on programmeerimise väga heaks eelduseks loogiline mõtlemine ning hea matemaatika. Pikemate programmide puhul tuleb kasuks ka püsivus ning tõenäoliselt mõned unetud ööd. Kui ka natuke muheleda, võiks öelda, et programmeerimine koosneb 90% matemaatikast, 9% loogika ning 0,5% kirjutamist. Ülejäänud 0,5% läheb ettenägematuteks kulutusteks.&lt;br /&gt;
&lt;br /&gt;
Teisalt pole programmeerimine ka lihtsalt mõttetu hunniku teksti kirjutamine (ning kui seda teha viletsalt, ei hakka programm üldse töölegi vaid loobib hunnikute viisi veateateid ning programmi vastu kaob huvi) või terve kuhja graafiliste vidinate kokkulöömine ideega sellest programm teha. Nii mõnedki kasulikud programmid on graafiliselt üpris inetud. Seetõttu üritame selles juhendis teha asja nii lõbusaks kui võimalik.&lt;br /&gt;
&lt;br /&gt;
== Mõisted ==&lt;br /&gt;
&lt;br /&gt;
Siinkohal mõned tähtsamad mõisted mida programmeerimises on tarvilik teada.&lt;br /&gt;
&lt;br /&gt;
*'''Muutuja''' – täht või sõna millele saab omistada väärtust, mida saab omakorda vajalikul momendil muuta. Muutujaks võib olla näiteks tikkude arv toosis – seda arvu saab muuta, või näiteks raamatus lugemata lehekülgede arv – ka see muutub. &lt;br /&gt;
*'''Konstant''' – muutumatu muutuja. Näiteks on konstant matemaatiline tähis ''pii'', ehk &amp;lt;code&amp;gt;3,1415926535897932384626433832795&amp;lt;/code&amp;gt;. See ei muutu. Või arv &amp;quot;e&amp;quot; &amp;lt;code&amp;gt;2.71828&amp;lt;/code&amp;gt;. Üldiselt on konstant mistahes arv-, sõne või tõeväärtus, mida me oleme oma programmis konstandina defineerinud ja väärtustanud. Konstandi väärtus programmi täitmise käigus muutuda ei saa. Selle poolest erineb konstant muutjast, mille väärtust on võimalik programmi täitmise käigus muuta. &amp;lt;br&amp;gt;Süsteemsed konstandid, on eeldefineeritud konstandid mida pole vaja eraldi defineerida. &amp;lt;br&amp;gt;Tambovi Konstant on arv mis liidetakse v6i lahutatakse, millega korrutatakse või jagatakse arvutatud tulemus, et saada soovitud tulemus. Tambovi Konstandi kasutamist peetakse üldiselt taunismisväärseks, kuid reaalsetes programmides tuleb seda liigagi tihti ette.&lt;br /&gt;
 &lt;br /&gt;
*'''Massiiv (array)''' – muutujate kogum. Raamatus on tähed ja leheküljed. Ütleme, et muutuja on lehekülg ning muutuja väärtus on lehekülje sisu. Kuna raamatus on palju lehekülgi siis kõik need leheküljed moodustavad massiivi. Ka poes müüdavad suured pakid tikutoose on tegelikult ju massiiv, sest kui tikutoos on muutuja ning tikkude arv toosis on muutuja väärtus, on need kõik toosid selles suures kilepakendis massiiv. &lt;br /&gt;
&lt;br /&gt;
*'''Kommentaar/kommenteerima''' – lõik(/lõigud) programmitekstis, mis ei leia kajastamist programmi kompileerimises. Lühidalt – kõik kommentaarid jäetakse kompileerimisel arvestamata. Näiteks võib seda kasutada juhul, kui on hirmsasti tarvis mingit osa koodist testida, ent üks teine osa jääb millegipärast ette. Kas on tõesti tarvis ettejääv osa ära koristada teelt? Ei, saab ka lihtsamini – kommenteerida lõik välja. Teisalt aitavad kommentaarid teksti selgitada. Kommentaarivaene tekst on tihtipeale kurjast. Tegelikult on ta pea kogu aeg kurjast. Kommenteerimata koodi on väga raske lugeda iseendalgi, kui kirjutamisest on palju aega möödas. Juurde aitavad küll selgitavad muutujad, ent muutujatest ei piisa. Kui kommentaare ei ole, ei pruugi kõrvalseisja välja jagada isegi seda, mida programm tegema peaks.&lt;br /&gt;
&lt;br /&gt;
''Programmeerimis keeles C++ on kommentaare kahte sorti. Ühed, mis kommenteerivad kommentaaritähise algusest rea lõpuni ning teised, mis kommenteerivad välja kasvõi terve faili kui vaja. Esimesi tähistatakse topeltkaldkriipsuga // ning teised käivad /* ja */ vahele (antud juhul oleks sõna „ja” välja kommenteeritud).&lt;br /&gt;
&lt;br /&gt;
C++ laadsed ühe rea kommentaarid on lubatud ka C99 standardis tavalises C's.''&lt;br /&gt;
&lt;br /&gt;
=== Muutuja ===&lt;br /&gt;
&lt;br /&gt;
Muutujad, nagu enne räägitud, on täht/tähed, millele saab omistada mingeid väärtusi. Ent ometigi ei saa kõikidele muutujatele ükskõik mis tüüpi väärtust omistada. Näiteks ei saa arvmuutujale omistada tekstmuutuja väärtust või täisarv-tüüpi muutujale ujukomaarv-tüüpi väärtust.&lt;br /&gt;
&lt;br /&gt;
Üldiselt on olemas päris palju erinevaid muutujatüüpe. Mõnda neist ka siinkohal lähedamalt vaatleme.&lt;br /&gt;
&lt;br /&gt;
'''''Int''''' (ehk täisarv):&lt;br /&gt;
&lt;br /&gt;
Integer-tüüpi muutujale saab omistada ainult täisarvulisi väärtusi, st näiteks 10, 150 aga ka 1239, aga ei saa omistada komaga väärtusi, nagu 27,5 või 2933,93929. Sõltuvalt süsteemist on ta võimeline saama erinevate vahemikega väärtusi.&lt;br /&gt;
&lt;br /&gt;
 '''16bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''32bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''64bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-9 223 372 036 854 775 808&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;9 223 372 036 854 775 807&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nagu näha omavad erinevates süsteemides täisarvud teistsuguseid väärtuste vahemikke. Kui vanade protsessoritega (16bitistega) sai opereerida täisarvudega maksimaalselt 65000 kohta, siis 32bitised protsessorid (Intel Pentiumist alates) olid võimelised juba kordades suuremate arvudega opereerima ning 64bitised (AMD Athlon 64, Intel EM64T) protsessorid on võimelised opereerima veelgi suuremate arvudega.&lt;br /&gt;
&lt;br /&gt;
Ometigi on võimalik välja kutsuda ka vanemate süsteemide muutujatüüpe, kasutades '''''__int8, __int16, __int32''''' ja '''''__int64'''''.&lt;br /&gt;
&lt;br /&gt;
Mis nende vahe on? Mälukohtade tarbimise vahe. 8bitine ja 16bitine täisarv kasutavad mõlemad 1 baidi mälust. 32bitine võtab juba 2 baiti ning 64bitine täisarv 4 baiti. Aga milles küsimus? Me ei ela ju enam 64 kilobaidi-ajastul. Aga selles on asi, et suurte programmide puhul kus ei ole mitte käputäis vaid paar(kümmend)tuhat muutujat on asi hoopis teine.&lt;br /&gt;
&lt;br /&gt;
Veel on olemas muutujatüübid nagu '''''short''''' ja '''''long'''''. '''''Short''''' ei ole tegelikult mitte midagi muud kui 16bitine täisarv vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt; ning long on 32bitine täisarv vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lisaks saab eelpool mainitud '''''short'''''’le ja '''''long'''''’le lisada eesliited '''''unsigned'''''. '''''Unsigned short''''' (kui muidu on '''''signed short''''') võib olla vahemikus 0 kuni &amp;lt;code&amp;gt;65 535&amp;lt;/code&amp;gt; ning unsigned long vahemikus 0 kuni &amp;lt;code&amp;gt;4 294 967 295&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Seejärel ujukomaarvud '''''float, double''''' ja '''''long double'''''. '''''Float''''' on kõige väiksem ujukomaarv, võtab mälus 4 baiti ning maksimaalseks suuruseks on &amp;lt;code&amp;gt;3,4*10&amp;lt;sup&amp;gt;+/-38&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Double on natuke ulatuslikum, võttes mälus 8 baiti ning vahemikuks &amp;lt;code&amp;gt;1,7*10&amp;lt;sup&amp;gt;+/-308&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Lõpuks on long double mis on neist kahest suurim (10 baiti) ning ulatuslikeim: &amp;lt;code&amp;gt;1,2*10&amp;lt;sup&amp;gt;+/-4932&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Viimaseks võiks ära mainida tekstmuutujad, millest kasutatavaim on '''''char'''''. Nimelt on char-tüüpi muutuja võimeline sisaldama endas ühte tähte. Kui temast teha massiiv, on ta ka võimeline sisaldama tervet stringi.&lt;br /&gt;
&lt;br /&gt;
=== Päisefailid ===&lt;br /&gt;
Päisefailid (headerid) on tavaliselt failid, mis sisaldavad programmi muutujaid, et hoida programmi koodis korda ja vajadusel oleks nt kindlat muutujat kerge üles leida. Peaaegu iga programmi koodis võib leida päisefaile. C++is on päisefailidel laiendiks &amp;quot;.h&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2605</id>
		<title>Sissejuhatus programmeerimisse</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2605"/>
		<updated>2005-11-23T19:31:03Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Mõisted */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
== Programmeerimine ==&lt;br /&gt;
&lt;br /&gt;
Mis on programmeerimine? Programmide loomine? Jah, nii võiks ta kokku võtta küll, ent tegelikkuses ei ole asi sugugi nii lilleline ning keerulisemate programmide tegemine võib võtta aega päevadest aastateni. Suuremad programmid koosnevad miljonitest (kui mitte miljarditest) ridadest koodist ning neid on arendatud aasta(kümne)id.&lt;br /&gt;
&lt;br /&gt;
Programmeerimine koosneb tegelikult paljudest staadiumitest. Tõsi, on võimalik võtta pähe, et „oh, ma nüüd lähen ja teen kohe programmi,” ent kui tõsisemaseks programmeerimiseks läheb, siis sellisest mõtteviisist ei piisa. Programmide loomise mõned etapid on näiteks ideestaadium, disainistaadium, projekteerimise staadium ja siis tuleb alles koodimise osa.&lt;br /&gt;
&lt;br /&gt;
Lisaks on programmeerimise väga heaks eelduseks loogiline mõtlemine ning hea matemaatika. Pikemate programmide puhul tuleb kasuks ka püsivus ning tõenäoliselt mõned unetud ööd. Kui ka natuke muheleda, võiks öelda, et programmeerimine koosneb 90% matemaatikast, 9% loogika ning 0,5% kirjutamist. Ülejäänud 0,5% läheb ettenägematuteks kulutusteks.&lt;br /&gt;
&lt;br /&gt;
Teisalt pole programmeerimine ka lihtsalt mõttetu hunniku teksti kirjutamine (ning kui seda teha viletsalt, ei hakka programm üldse töölegi vaid loobib hunnikute viisi veateateid ning programmi vastu kaob huvi) või terve kuhja graafiliste vidinate kokkulöömine ideega sellest programm teha. Nii mõnedki kasulikud programmid on graafiliselt üpris inetud. Seetõttu üritame selles juhendis teha asja nii lõbusaks kui võimalik.&lt;br /&gt;
&lt;br /&gt;
== Mõisted ==&lt;br /&gt;
&lt;br /&gt;
Siinkohal mõned tähtsamad mõisted mida programmeerimises on tarvilik teada.&lt;br /&gt;
&lt;br /&gt;
*'''Muutuja''' – täht või sõna millele saab omistada väärtust, mida saab omakorda vajalikul momendil muuta. Muutujaks võib olla näiteks tikkude arv toosis – seda arvu saab muuta, või näiteks raamatus lugemata lehekülgede arv – ka see muutub. &lt;br /&gt;
*'''Konstant''' – muutumatu muutuja. Näiteks on konstant matemaatiline tähis ''pii'', ehk &amp;lt;code&amp;gt;3,1415926535897932384626433832795&amp;lt;/code&amp;gt;. See ei muutu. Või arv &amp;quot;e&amp;quot; &amp;lt;code&amp;gt;2.71828&amp;lt;/code&amp;gt;. Üldiselt on konstant mistahes arv-, sõne või tõeväärtus, mida me oleme oma programmis konstandina defineerinud ja väärtustanud. Konstandi väärtus programmi täitmise käigus muutuda ei saa. Selle poolest erineb konstant muutjast, mille väärtust on võimalik programmi täitmise käigus muuta. &amp;lt;br&amp;gt;Süsteemsed konstandid, on eeldefineeritud konstandid mida pole vaja eraldi defineerida.&lt;br /&gt;
&amp;lt;br&amp;gt;Tambovi Konstant on arv mis liidetakse v6i lahutatakse, millega korrutatakse või jagatakse arvutatud tulemus, et saada soovitud tulemus. Tambovi Konstandi kasutamist peetakse üldiselt taunismisväärseks, kuid reaalsetes programmides tuleb seda liigagi tihti ette.&lt;br /&gt;
 &lt;br /&gt;
*'''Massiiv (array)''' – muutujate kogum. Raamatus on tähed ja leheküljed. Ütleme, et muutuja on lehekülg ning muutuja väärtus on lehekülje sisu. Kuna raamatus on palju lehekülgi siis kõik need leheküljed moodustavad massiivi. Ka poes müüdavad suured pakid tikutoose on tegelikult ju massiiv, sest kui tikutoos on muutuja ning tikkude arv toosis on muutuja väärtus, on need kõik toosid selles suures kilepakendis massiiv. &lt;br /&gt;
&lt;br /&gt;
*'''Kommentaar/kommenteerima''' – lõik(/lõigud) programmitekstis, mis ei leia kajastamist programmi kompileerimises. Lühidalt – kõik kommentaarid jäetakse kompileerimisel arvestamata. Näiteks võib seda kasutada juhul, kui on hirmsasti tarvis mingit osa koodist testida, ent üks teine osa jääb millegipärast ette. Kas on tõesti tarvis ettejääv osa ära koristada teelt? Ei, saab ka lihtsamini – kommenteerida lõik välja. Teisalt aitavad kommentaarid teksti selgitada. Kommentaarivaene tekst on tihtipeale kurjast. Tegelikult on ta pea kogu aeg kurjast. Kommenteerimata koodi on väga raske lugeda iseendalgi, kui kirjutamisest on palju aega möödas. Juurde aitavad küll selgitavad muutujad, ent muutujatest ei piisa. Kui kommentaare ei ole, ei pruugi kõrvalseisja välja jagada isegi seda, mida programm tegema peaks.&lt;br /&gt;
&lt;br /&gt;
''Programmeerimis keeles C++ on kommentaare kahte sorti. Ühed, mis kommenteerivad kommentaaritähise algusest rea lõpuni ning teised, mis kommenteerivad välja kasvõi terve faili kui vaja. Esimesi tähistatakse topeltkaldkriipsuga // ning teised käivad /* ja */ vahele (antud juhul oleks sõna „ja” välja kommenteeritud).&lt;br /&gt;
&lt;br /&gt;
C++ laadsed ühe rea kommentaarid on lubatud ka C99 standardis tavalises C's.''&lt;br /&gt;
&lt;br /&gt;
=== Muutuja ===&lt;br /&gt;
&lt;br /&gt;
Muutujad, nagu enne räägitud, on täht/tähed, millele saab omistada mingeid väärtusi. Ent ometigi ei saa kõikidele muutujatele ükskõik mis tüüpi väärtust omistada. Näiteks ei saa arvmuutujale omistada tekstmuutuja väärtust või täisarv-tüüpi muutujale ujukomaarv-tüüpi väärtust.&lt;br /&gt;
&lt;br /&gt;
Üldiselt on olemas päris palju erinevaid muutujatüüpe. Mõnda neist ka siinkohal lähedamalt vaatleme.&lt;br /&gt;
&lt;br /&gt;
'''''Int''''' (ehk täisarv):&lt;br /&gt;
&lt;br /&gt;
Integer-tüüpi muutujale saab omistada ainult täisarvulisi väärtusi, st näiteks 10, 150 aga ka 1239, aga ei saa omistada komaga väärtusi, nagu 27,5 või 2933,93929. Sõltuvalt süsteemist on ta võimeline saama erinevate vahemikega väärtusi.&lt;br /&gt;
&lt;br /&gt;
 '''16bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''32bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''64bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-9 223 372 036 854 775 808&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;9 223 372 036 854 775 807&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nagu näha omavad erinevates süsteemides täisarvud teistsuguseid väärtuste vahemikke. Kui vanade protsessoritega (16bitistega) sai opereerida täisarvudega maksimaalselt 65000 kohta, siis 32bitised protsessorid (Intel Pentiumist alates) olid võimelised juba kordades suuremate arvudega opereerima ning 64bitised (AMD Athlon 64, Intel EM64T) protsessorid on võimelised opereerima veelgi suuremate arvudega.&lt;br /&gt;
&lt;br /&gt;
Ometigi on võimalik välja kutsuda ka vanemate süsteemide muutujatüüpe, kasutades '''''__int8, __int16, __int32''''' ja '''''__int64'''''.&lt;br /&gt;
&lt;br /&gt;
Mis nende vahe on? Mälukohtade tarbimise vahe. 8bitine ja 16bitine täisarv kasutavad mõlemad 1 baidi mälust. 32bitine võtab juba 2 baiti ning 64bitine täisarv 4 baiti. Aga milles küsimus? Me ei ela ju enam 64 kilobaidi-ajastul. Aga selles on asi, et suurte programmide puhul kus ei ole mitte käputäis vaid paar(kümmend)tuhat muutujat on asi hoopis teine.&lt;br /&gt;
&lt;br /&gt;
Veel on olemas muutujatüübid nagu '''''short''''' ja '''''long'''''. '''''Short''''' ei ole tegelikult mitte midagi muud kui 16bitine täisarv vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt; ning long on 32bitine täisarv vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lisaks saab eelpool mainitud '''''short'''''’le ja '''''long'''''’le lisada eesliited '''''unsigned'''''. '''''Unsigned short''''' (kui muidu on '''''signed short''''') võib olla vahemikus 0 kuni &amp;lt;code&amp;gt;65 535&amp;lt;/code&amp;gt; ning unsigned long vahemikus 0 kuni &amp;lt;code&amp;gt;4 294 967 295&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Seejärel ujukomaarvud '''''float, double''''' ja '''''long double'''''. '''''Float''''' on kõige väiksem ujukomaarv, võtab mälus 4 baiti ning maksimaalseks suuruseks on &amp;lt;code&amp;gt;3,4*10&amp;lt;sup&amp;gt;+/-38&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Double on natuke ulatuslikum, võttes mälus 8 baiti ning vahemikuks &amp;lt;code&amp;gt;1,7*10&amp;lt;sup&amp;gt;+/-308&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Lõpuks on long double mis on neist kahest suurim (10 baiti) ning ulatuslikeim: &amp;lt;code&amp;gt;1,2*10&amp;lt;sup&amp;gt;+/-4932&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Viimaseks võiks ära mainida tekstmuutujad, millest kasutatavaim on '''''char'''''. Nimelt on char-tüüpi muutuja võimeline sisaldama endas ühte tähte. Kui temast teha massiiv, on ta ka võimeline sisaldama tervet stringi.&lt;br /&gt;
&lt;br /&gt;
=== Päisefailid ===&lt;br /&gt;
Päisefailid (headerid) on tavaliselt failid, mis sisaldavad programmi muutujaid, et hoida programmi koodis korda ja vajadusel oleks nt kindlat muutujat kerge üles leida. Peaaegu iga programmi koodis võib leida päisefaile. C++is on päisefailidel laiendiks &amp;quot;.h&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2604</id>
		<title>Sissejuhatus programmeerimisse</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2604"/>
		<updated>2005-11-23T19:30:25Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Mõisted */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
== Programmeerimine ==&lt;br /&gt;
&lt;br /&gt;
Mis on programmeerimine? Programmide loomine? Jah, nii võiks ta kokku võtta küll, ent tegelikkuses ei ole asi sugugi nii lilleline ning keerulisemate programmide tegemine võib võtta aega päevadest aastateni. Suuremad programmid koosnevad miljonitest (kui mitte miljarditest) ridadest koodist ning neid on arendatud aasta(kümne)id.&lt;br /&gt;
&lt;br /&gt;
Programmeerimine koosneb tegelikult paljudest staadiumitest. Tõsi, on võimalik võtta pähe, et „oh, ma nüüd lähen ja teen kohe programmi,” ent kui tõsisemaseks programmeerimiseks läheb, siis sellisest mõtteviisist ei piisa. Programmide loomise mõned etapid on näiteks ideestaadium, disainistaadium, projekteerimise staadium ja siis tuleb alles koodimise osa.&lt;br /&gt;
&lt;br /&gt;
Lisaks on programmeerimise väga heaks eelduseks loogiline mõtlemine ning hea matemaatika. Pikemate programmide puhul tuleb kasuks ka püsivus ning tõenäoliselt mõned unetud ööd. Kui ka natuke muheleda, võiks öelda, et programmeerimine koosneb 90% matemaatikast, 9% loogika ning 0,5% kirjutamist. Ülejäänud 0,5% läheb ettenägematuteks kulutusteks.&lt;br /&gt;
&lt;br /&gt;
Teisalt pole programmeerimine ka lihtsalt mõttetu hunniku teksti kirjutamine (ning kui seda teha viletsalt, ei hakka programm üldse töölegi vaid loobib hunnikute viisi veateateid ning programmi vastu kaob huvi) või terve kuhja graafiliste vidinate kokkulöömine ideega sellest programm teha. Nii mõnedki kasulikud programmid on graafiliselt üpris inetud. Seetõttu üritame selles juhendis teha asja nii lõbusaks kui võimalik.&lt;br /&gt;
&lt;br /&gt;
== Mõisted ==&lt;br /&gt;
&lt;br /&gt;
Siinkohal mõned tähtsamad mõisted mida programmeerimises on tarvilik teada.&lt;br /&gt;
&lt;br /&gt;
*'''Muutuja''' – täht või sõna millele saab omistada väärtust, mida saab omakorda vajalikul momendil muuta. Muutujaks võib olla näiteks tikkude arv toosis – seda arvu saab muuta, või näiteks raamatus lugemata lehekülgede arv – ka see muutub. &lt;br /&gt;
*'''Konstant''' – muutumatu muutuja. Näiteks on konstant matemaatiline tähis ''pii'', ehk &amp;lt;code&amp;gt;3,1415926535897932384626433832795&amp;lt;/code&amp;gt;. See ei muutu. Või arv &amp;quot;e&amp;quot; &amp;lt;code&amp;gt;2.71828&amp;lt;/code&amp;gt;. Üldiselt on konstant mistahes arv-, sõne või tõeväärtus, mida me oleme oma programmis konstandina defineerinud ja väärtustanud. Konstandi väärtus programmi täitmise käigus muutuda ei saa. Selle poolest erineb konstant muutjast, mille väärtust on võimalik programmi täitmise käigus muuta.&lt;br /&gt;
&amp;lt;br&amp;gt;Süsteemsed konstandid, on eeldefineeritud konstandid mida pole vaja eraldi defineerida. &lt;br /&gt;
&amp;lt;br&amp;gt;Tambovi Konstant on arv mis liidetakse v6i lahutatakse, millega korrutatakse või jagatakse arvutatud tulemus, et saada soovitud tulemus. Tambovi Konstandi kasutamist peetakse üldiselt taunismisväärseks, kuid reaalsetes programmides tuleb seda liigagi tihti ette.&lt;br /&gt;
 &lt;br /&gt;
*'''Massiiv (array)''' – muutujate kogum. Raamatus on tähed ja leheküljed. Ütleme, et muutuja on lehekülg ning muutuja väärtus on lehekülje sisu. Kuna raamatus on palju lehekülgi siis kõik need leheküljed moodustavad massiivi. Ka poes müüdavad suured pakid tikutoose on tegelikult ju massiiv, sest kui tikutoos on muutuja ning tikkude arv toosis on muutuja väärtus, on need kõik toosid selles suures kilepakendis massiiv. &lt;br /&gt;
&lt;br /&gt;
*'''Kommentaar/kommenteerima''' – lõik(/lõigud) programmitekstis, mis ei leia kajastamist programmi kompileerimises. Lühidalt – kõik kommentaarid jäetakse kompileerimisel arvestamata. Näiteks võib seda kasutada juhul, kui on hirmsasti tarvis mingit osa koodist testida, ent üks teine osa jääb millegipärast ette. Kas on tõesti tarvis ettejääv osa ära koristada teelt? Ei, saab ka lihtsamini – kommenteerida lõik välja. Teisalt aitavad kommentaarid teksti selgitada. Kommentaarivaene tekst on tihtipeale kurjast. Tegelikult on ta pea kogu aeg kurjast. Kommenteerimata koodi on väga raske lugeda iseendalgi, kui kirjutamisest on palju aega möödas. Juurde aitavad küll selgitavad muutujad, ent muutujatest ei piisa. Kui kommentaare ei ole, ei pruugi kõrvalseisja välja jagada isegi seda, mida programm tegema peaks.&lt;br /&gt;
&lt;br /&gt;
''Programmeerimis keeles C++ on kommentaare kahte sorti. Ühed, mis kommenteerivad kommentaaritähise algusest rea lõpuni ning teised, mis kommenteerivad välja kasvõi terve faili kui vaja. Esimesi tähistatakse topeltkaldkriipsuga // ning teised käivad /* ja */ vahele (antud juhul oleks sõna „ja” välja kommenteeritud).&lt;br /&gt;
&lt;br /&gt;
C++ laadsed ühe rea kommentaarid on lubatud ka C99 standardis tavalises C's.''&lt;br /&gt;
&lt;br /&gt;
=== Muutuja ===&lt;br /&gt;
&lt;br /&gt;
Muutujad, nagu enne räägitud, on täht/tähed, millele saab omistada mingeid väärtusi. Ent ometigi ei saa kõikidele muutujatele ükskõik mis tüüpi väärtust omistada. Näiteks ei saa arvmuutujale omistada tekstmuutuja väärtust või täisarv-tüüpi muutujale ujukomaarv-tüüpi väärtust.&lt;br /&gt;
&lt;br /&gt;
Üldiselt on olemas päris palju erinevaid muutujatüüpe. Mõnda neist ka siinkohal lähedamalt vaatleme.&lt;br /&gt;
&lt;br /&gt;
'''''Int''''' (ehk täisarv):&lt;br /&gt;
&lt;br /&gt;
Integer-tüüpi muutujale saab omistada ainult täisarvulisi väärtusi, st näiteks 10, 150 aga ka 1239, aga ei saa omistada komaga väärtusi, nagu 27,5 või 2933,93929. Sõltuvalt süsteemist on ta võimeline saama erinevate vahemikega väärtusi.&lt;br /&gt;
&lt;br /&gt;
 '''16bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''32bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''64bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-9 223 372 036 854 775 808&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;9 223 372 036 854 775 807&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nagu näha omavad erinevates süsteemides täisarvud teistsuguseid väärtuste vahemikke. Kui vanade protsessoritega (16bitistega) sai opereerida täisarvudega maksimaalselt 65000 kohta, siis 32bitised protsessorid (Intel Pentiumist alates) olid võimelised juba kordades suuremate arvudega opereerima ning 64bitised (AMD Athlon 64, Intel EM64T) protsessorid on võimelised opereerima veelgi suuremate arvudega.&lt;br /&gt;
&lt;br /&gt;
Ometigi on võimalik välja kutsuda ka vanemate süsteemide muutujatüüpe, kasutades '''''__int8, __int16, __int32''''' ja '''''__int64'''''.&lt;br /&gt;
&lt;br /&gt;
Mis nende vahe on? Mälukohtade tarbimise vahe. 8bitine ja 16bitine täisarv kasutavad mõlemad 1 baidi mälust. 32bitine võtab juba 2 baiti ning 64bitine täisarv 4 baiti. Aga milles küsimus? Me ei ela ju enam 64 kilobaidi-ajastul. Aga selles on asi, et suurte programmide puhul kus ei ole mitte käputäis vaid paar(kümmend)tuhat muutujat on asi hoopis teine.&lt;br /&gt;
&lt;br /&gt;
Veel on olemas muutujatüübid nagu '''''short''''' ja '''''long'''''. '''''Short''''' ei ole tegelikult mitte midagi muud kui 16bitine täisarv vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt; ning long on 32bitine täisarv vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lisaks saab eelpool mainitud '''''short'''''’le ja '''''long'''''’le lisada eesliited '''''unsigned'''''. '''''Unsigned short''''' (kui muidu on '''''signed short''''') võib olla vahemikus 0 kuni &amp;lt;code&amp;gt;65 535&amp;lt;/code&amp;gt; ning unsigned long vahemikus 0 kuni &amp;lt;code&amp;gt;4 294 967 295&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Seejärel ujukomaarvud '''''float, double''''' ja '''''long double'''''. '''''Float''''' on kõige väiksem ujukomaarv, võtab mälus 4 baiti ning maksimaalseks suuruseks on &amp;lt;code&amp;gt;3,4*10&amp;lt;sup&amp;gt;+/-38&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Double on natuke ulatuslikum, võttes mälus 8 baiti ning vahemikuks &amp;lt;code&amp;gt;1,7*10&amp;lt;sup&amp;gt;+/-308&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Lõpuks on long double mis on neist kahest suurim (10 baiti) ning ulatuslikeim: &amp;lt;code&amp;gt;1,2*10&amp;lt;sup&amp;gt;+/-4932&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Viimaseks võiks ära mainida tekstmuutujad, millest kasutatavaim on '''''char'''''. Nimelt on char-tüüpi muutuja võimeline sisaldama endas ühte tähte. Kui temast teha massiiv, on ta ka võimeline sisaldama tervet stringi.&lt;br /&gt;
&lt;br /&gt;
=== Päisefailid ===&lt;br /&gt;
Päisefailid (headerid) on tavaliselt failid, mis sisaldavad programmi muutujaid, et hoida programmi koodis korda ja vajadusel oleks nt kindlat muutujat kerge üles leida. Peaaegu iga programmi koodis võib leida päisefaile. C++is on päisefailidel laiendiks &amp;quot;.h&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2603</id>
		<title>Sissejuhatus programmeerimisse</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2603"/>
		<updated>2005-11-23T19:29:38Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Mõisted */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
== Programmeerimine ==&lt;br /&gt;
&lt;br /&gt;
Mis on programmeerimine? Programmide loomine? Jah, nii võiks ta kokku võtta küll, ent tegelikkuses ei ole asi sugugi nii lilleline ning keerulisemate programmide tegemine võib võtta aega päevadest aastateni. Suuremad programmid koosnevad miljonitest (kui mitte miljarditest) ridadest koodist ning neid on arendatud aasta(kümne)id.&lt;br /&gt;
&lt;br /&gt;
Programmeerimine koosneb tegelikult paljudest staadiumitest. Tõsi, on võimalik võtta pähe, et „oh, ma nüüd lähen ja teen kohe programmi,” ent kui tõsisemaseks programmeerimiseks läheb, siis sellisest mõtteviisist ei piisa. Programmide loomise mõned etapid on näiteks ideestaadium, disainistaadium, projekteerimise staadium ja siis tuleb alles koodimise osa.&lt;br /&gt;
&lt;br /&gt;
Lisaks on programmeerimise väga heaks eelduseks loogiline mõtlemine ning hea matemaatika. Pikemate programmide puhul tuleb kasuks ka püsivus ning tõenäoliselt mõned unetud ööd. Kui ka natuke muheleda, võiks öelda, et programmeerimine koosneb 90% matemaatikast, 9% loogika ning 0,5% kirjutamist. Ülejäänud 0,5% läheb ettenägematuteks kulutusteks.&lt;br /&gt;
&lt;br /&gt;
Teisalt pole programmeerimine ka lihtsalt mõttetu hunniku teksti kirjutamine (ning kui seda teha viletsalt, ei hakka programm üldse töölegi vaid loobib hunnikute viisi veateateid ning programmi vastu kaob huvi) või terve kuhja graafiliste vidinate kokkulöömine ideega sellest programm teha. Nii mõnedki kasulikud programmid on graafiliselt üpris inetud. Seetõttu üritame selles juhendis teha asja nii lõbusaks kui võimalik.&lt;br /&gt;
&lt;br /&gt;
== Mõisted ==&lt;br /&gt;
&lt;br /&gt;
Siinkohal mõned tähtsamad mõisted mida programmeerimises on tarvilik teada.&lt;br /&gt;
&lt;br /&gt;
*'''Muutuja''' – täht või sõna millele saab omistada väärtust, mida saab omakorda vajalikul momendil muuta. Muutujaks võib olla näiteks tikkude arv toosis – seda arvu saab muuta, või näiteks raamatus lugemata lehekülgede arv – ka see muutub. &lt;br /&gt;
*'''Konstant''' – muutumatu muutuja. Näiteks on konstant matemaatiline tähis ''pii'', ehk &amp;lt;code&amp;gt;3,1415926535897932384626433832795&amp;lt;/code&amp;gt;. See ei muutu. Või arv &amp;quot;e&amp;quot; &amp;lt;code&amp;gt;2.71828&amp;lt;/code&amp;gt;. Üldiselt on konstant mistahes arv-, sõne või tõeväärtus, mida me oleme oma programmis konstandina defineerinud ja väärtustanud. Konstandi väärtus programmi täitmise käigus muutuda ei saa. Selle poolest erineb konstant muutjast, mille väärtust on võimalik programmi täitmise käigus muuta. &lt;br /&gt;
&lt;br /&gt;
Süsteemsed konstandid, on eeldefineeritud konstandid mida pole vaja eraldi defineerida. &lt;br /&gt;
Tambovi Konstant on arv mis liidetakse v6i lahutatakse, millega korrutatakse või jagatakse arvutatud tulemus, et saada soovitud tulemus. Tambovi Konstandi kasutamist peetakse üldiselt taunismisväärseks, kuid reaalsetes programmides tuleb seda liigagi tihti ette.&lt;br /&gt;
 &lt;br /&gt;
*'''Massiiv (array)''' – muutujate kogum. Raamatus on tähed ja leheküljed. Ütleme, et muutuja on lehekülg ning muutuja väärtus on lehekülje sisu. Kuna raamatus on palju lehekülgi siis kõik need leheküljed moodustavad massiivi. Ka poes müüdavad suured pakid tikutoose on tegelikult ju massiiv, sest kui tikutoos on muutuja ning tikkude arv toosis on muutuja väärtus, on need kõik toosid selles suures kilepakendis massiiv. &lt;br /&gt;
&lt;br /&gt;
*'''Kommentaar/kommenteerima''' – lõik(/lõigud) programmitekstis, mis ei leia kajastamist programmi kompileerimises. Lühidalt – kõik kommentaarid jäetakse kompileerimisel arvestamata. Näiteks võib seda kasutada juhul, kui on hirmsasti tarvis mingit osa koodist testida, ent üks teine osa jääb millegipärast ette. Kas on tõesti tarvis ettejääv osa ära koristada teelt? Ei, saab ka lihtsamini – kommenteerida lõik välja. Teisalt aitavad kommentaarid teksti selgitada. Kommentaarivaene tekst on tihtipeale kurjast. Tegelikult on ta pea kogu aeg kurjast. Kommenteerimata koodi on väga raske lugeda iseendalgi, kui kirjutamisest on palju aega möödas. Juurde aitavad küll selgitavad muutujad, ent muutujatest ei piisa. Kui kommentaare ei ole, ei pruugi kõrvalseisja välja jagada isegi seda, mida programm tegema peaks.&lt;br /&gt;
&lt;br /&gt;
''Programmeerimis keeles C++ on kommentaare kahte sorti. Ühed, mis kommenteerivad kommentaaritähise algusest rea lõpuni ning teised, mis kommenteerivad välja kasvõi terve faili kui vaja. Esimesi tähistatakse topeltkaldkriipsuga // ning teised käivad /* ja */ vahele (antud juhul oleks sõna „ja” välja kommenteeritud).&lt;br /&gt;
&lt;br /&gt;
C++ laadsed ühe rea kommentaarid on lubatud ka C99 standardis tavalises C's.''&lt;br /&gt;
&lt;br /&gt;
=== Muutuja ===&lt;br /&gt;
&lt;br /&gt;
Muutujad, nagu enne räägitud, on täht/tähed, millele saab omistada mingeid väärtusi. Ent ometigi ei saa kõikidele muutujatele ükskõik mis tüüpi väärtust omistada. Näiteks ei saa arvmuutujale omistada tekstmuutuja väärtust või täisarv-tüüpi muutujale ujukomaarv-tüüpi väärtust.&lt;br /&gt;
&lt;br /&gt;
Üldiselt on olemas päris palju erinevaid muutujatüüpe. Mõnda neist ka siinkohal lähedamalt vaatleme.&lt;br /&gt;
&lt;br /&gt;
'''''Int''''' (ehk täisarv):&lt;br /&gt;
&lt;br /&gt;
Integer-tüüpi muutujale saab omistada ainult täisarvulisi väärtusi, st näiteks 10, 150 aga ka 1239, aga ei saa omistada komaga väärtusi, nagu 27,5 või 2933,93929. Sõltuvalt süsteemist on ta võimeline saama erinevate vahemikega väärtusi.&lt;br /&gt;
&lt;br /&gt;
 '''16bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''32bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''64bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-9 223 372 036 854 775 808&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;9 223 372 036 854 775 807&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nagu näha omavad erinevates süsteemides täisarvud teistsuguseid väärtuste vahemikke. Kui vanade protsessoritega (16bitistega) sai opereerida täisarvudega maksimaalselt 65000 kohta, siis 32bitised protsessorid (Intel Pentiumist alates) olid võimelised juba kordades suuremate arvudega opereerima ning 64bitised (AMD Athlon 64, Intel EM64T) protsessorid on võimelised opereerima veelgi suuremate arvudega.&lt;br /&gt;
&lt;br /&gt;
Ometigi on võimalik välja kutsuda ka vanemate süsteemide muutujatüüpe, kasutades '''''__int8, __int16, __int32''''' ja '''''__int64'''''.&lt;br /&gt;
&lt;br /&gt;
Mis nende vahe on? Mälukohtade tarbimise vahe. 8bitine ja 16bitine täisarv kasutavad mõlemad 1 baidi mälust. 32bitine võtab juba 2 baiti ning 64bitine täisarv 4 baiti. Aga milles küsimus? Me ei ela ju enam 64 kilobaidi-ajastul. Aga selles on asi, et suurte programmide puhul kus ei ole mitte käputäis vaid paar(kümmend)tuhat muutujat on asi hoopis teine.&lt;br /&gt;
&lt;br /&gt;
Veel on olemas muutujatüübid nagu '''''short''''' ja '''''long'''''. '''''Short''''' ei ole tegelikult mitte midagi muud kui 16bitine täisarv vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt; ning long on 32bitine täisarv vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lisaks saab eelpool mainitud '''''short'''''’le ja '''''long'''''’le lisada eesliited '''''unsigned'''''. '''''Unsigned short''''' (kui muidu on '''''signed short''''') võib olla vahemikus 0 kuni &amp;lt;code&amp;gt;65 535&amp;lt;/code&amp;gt; ning unsigned long vahemikus 0 kuni &amp;lt;code&amp;gt;4 294 967 295&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Seejärel ujukomaarvud '''''float, double''''' ja '''''long double'''''. '''''Float''''' on kõige väiksem ujukomaarv, võtab mälus 4 baiti ning maksimaalseks suuruseks on &amp;lt;code&amp;gt;3,4*10&amp;lt;sup&amp;gt;+/-38&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Double on natuke ulatuslikum, võttes mälus 8 baiti ning vahemikuks &amp;lt;code&amp;gt;1,7*10&amp;lt;sup&amp;gt;+/-308&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Lõpuks on long double mis on neist kahest suurim (10 baiti) ning ulatuslikeim: &amp;lt;code&amp;gt;1,2*10&amp;lt;sup&amp;gt;+/-4932&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Viimaseks võiks ära mainida tekstmuutujad, millest kasutatavaim on '''''char'''''. Nimelt on char-tüüpi muutuja võimeline sisaldama endas ühte tähte. Kui temast teha massiiv, on ta ka võimeline sisaldama tervet stringi.&lt;br /&gt;
&lt;br /&gt;
=== Päisefailid ===&lt;br /&gt;
Päisefailid (headerid) on tavaliselt failid, mis sisaldavad programmi muutujaid, et hoida programmi koodis korda ja vajadusel oleks nt kindlat muutujat kerge üles leida. Peaaegu iga programmi koodis võib leida päisefaile. C++is on päisefailidel laiendiks &amp;quot;.h&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2602</id>
		<title>Sissejuhatus programmeerimisse</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2602"/>
		<updated>2005-11-23T19:29:14Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Mõisted */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
== Programmeerimine ==&lt;br /&gt;
&lt;br /&gt;
Mis on programmeerimine? Programmide loomine? Jah, nii võiks ta kokku võtta küll, ent tegelikkuses ei ole asi sugugi nii lilleline ning keerulisemate programmide tegemine võib võtta aega päevadest aastateni. Suuremad programmid koosnevad miljonitest (kui mitte miljarditest) ridadest koodist ning neid on arendatud aasta(kümne)id.&lt;br /&gt;
&lt;br /&gt;
Programmeerimine koosneb tegelikult paljudest staadiumitest. Tõsi, on võimalik võtta pähe, et „oh, ma nüüd lähen ja teen kohe programmi,” ent kui tõsisemaseks programmeerimiseks läheb, siis sellisest mõtteviisist ei piisa. Programmide loomise mõned etapid on näiteks ideestaadium, disainistaadium, projekteerimise staadium ja siis tuleb alles koodimise osa.&lt;br /&gt;
&lt;br /&gt;
Lisaks on programmeerimise väga heaks eelduseks loogiline mõtlemine ning hea matemaatika. Pikemate programmide puhul tuleb kasuks ka püsivus ning tõenäoliselt mõned unetud ööd. Kui ka natuke muheleda, võiks öelda, et programmeerimine koosneb 90% matemaatikast, 9% loogika ning 0,5% kirjutamist. Ülejäänud 0,5% läheb ettenägematuteks kulutusteks.&lt;br /&gt;
&lt;br /&gt;
Teisalt pole programmeerimine ka lihtsalt mõttetu hunniku teksti kirjutamine (ning kui seda teha viletsalt, ei hakka programm üldse töölegi vaid loobib hunnikute viisi veateateid ning programmi vastu kaob huvi) või terve kuhja graafiliste vidinate kokkulöömine ideega sellest programm teha. Nii mõnedki kasulikud programmid on graafiliselt üpris inetud. Seetõttu üritame selles juhendis teha asja nii lõbusaks kui võimalik.&lt;br /&gt;
&lt;br /&gt;
== Mõisted ==&lt;br /&gt;
&lt;br /&gt;
Siinkohal mõned tähtsamad mõisted mida programmeerimises on tarvilik teada.&lt;br /&gt;
&lt;br /&gt;
*'''Muutuja''' – täht või sõna millele saab omistada väärtust, mida saab omakorda vajalikul momendil muuta. Muutujaks võib olla näiteks tikkude arv toosis – seda arvu saab muuta, või näiteks raamatus lugemata lehekülgede arv – ka see muutub. &lt;br /&gt;
*'''Konstant''' – muutumatu muutuja. Näiteks on konstant matemaatiline tähis ''pii'', ehk &amp;lt;code&amp;gt;3,1415926535897932384626433832795&amp;lt;/code&amp;gt;. See ei muutu. Või arv &amp;quot;e&amp;quot; &amp;lt;code&amp;gt;2.71828&amp;lt;/code&amp;gt;. Üldiselt on konstant mistahes arv-, sõne või tõeväärtus, mida me oleme oma programmis konstandina defineerinud ja väärtustanud. Konstandi väärtus programmi täitmise käigus muutuda ei saa. Selle poolest erineb konstant muutjast, mille väärtust on võimalik programmi täitmise käigus muuta. Süsteemsed konstandid, on eeldefineeritud konstandid mida pole vaja eraldi defineerida. &lt;br /&gt;
Tambovi Konstant on arv mis liidetakse v6i lahutatakse, millega korrutatakse või jagatakse arvutatud tulemus, et saada soovitud tulemus. Tambovi Konstandi kasutamist peetakse üldiselt taunismisväärseks, kuid reaalsetes programmides tuleb seda liigagi tihti ette.&lt;br /&gt;
 &lt;br /&gt;
*'''Massiiv (array)''' – muutujate kogum. Raamatus on tähed ja leheküljed. Ütleme, et muutuja on lehekülg ning muutuja väärtus on lehekülje sisu. Kuna raamatus on palju lehekülgi siis kõik need leheküljed moodustavad massiivi. Ka poes müüdavad suured pakid tikutoose on tegelikult ju massiiv, sest kui tikutoos on muutuja ning tikkude arv toosis on muutuja väärtus, on need kõik toosid selles suures kilepakendis massiiv. &lt;br /&gt;
&lt;br /&gt;
*'''Kommentaar/kommenteerima''' – lõik(/lõigud) programmitekstis, mis ei leia kajastamist programmi kompileerimises. Lühidalt – kõik kommentaarid jäetakse kompileerimisel arvestamata. Näiteks võib seda kasutada juhul, kui on hirmsasti tarvis mingit osa koodist testida, ent üks teine osa jääb millegipärast ette. Kas on tõesti tarvis ettejääv osa ära koristada teelt? Ei, saab ka lihtsamini – kommenteerida lõik välja. Teisalt aitavad kommentaarid teksti selgitada. Kommentaarivaene tekst on tihtipeale kurjast. Tegelikult on ta pea kogu aeg kurjast. Kommenteerimata koodi on väga raske lugeda iseendalgi, kui kirjutamisest on palju aega möödas. Juurde aitavad küll selgitavad muutujad, ent muutujatest ei piisa. Kui kommentaare ei ole, ei pruugi kõrvalseisja välja jagada isegi seda, mida programm tegema peaks.&lt;br /&gt;
&lt;br /&gt;
''Programmeerimis keeles C++ on kommentaare kahte sorti. Ühed, mis kommenteerivad kommentaaritähise algusest rea lõpuni ning teised, mis kommenteerivad välja kasvõi terve faili kui vaja. Esimesi tähistatakse topeltkaldkriipsuga // ning teised käivad /* ja */ vahele (antud juhul oleks sõna „ja” välja kommenteeritud).&lt;br /&gt;
&lt;br /&gt;
C++ laadsed ühe rea kommentaarid on lubatud ka C99 standardis tavalises C's.''&lt;br /&gt;
&lt;br /&gt;
=== Muutuja ===&lt;br /&gt;
&lt;br /&gt;
Muutujad, nagu enne räägitud, on täht/tähed, millele saab omistada mingeid väärtusi. Ent ometigi ei saa kõikidele muutujatele ükskõik mis tüüpi väärtust omistada. Näiteks ei saa arvmuutujale omistada tekstmuutuja väärtust või täisarv-tüüpi muutujale ujukomaarv-tüüpi väärtust.&lt;br /&gt;
&lt;br /&gt;
Üldiselt on olemas päris palju erinevaid muutujatüüpe. Mõnda neist ka siinkohal lähedamalt vaatleme.&lt;br /&gt;
&lt;br /&gt;
'''''Int''''' (ehk täisarv):&lt;br /&gt;
&lt;br /&gt;
Integer-tüüpi muutujale saab omistada ainult täisarvulisi väärtusi, st näiteks 10, 150 aga ka 1239, aga ei saa omistada komaga väärtusi, nagu 27,5 või 2933,93929. Sõltuvalt süsteemist on ta võimeline saama erinevate vahemikega väärtusi.&lt;br /&gt;
&lt;br /&gt;
 '''16bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''32bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''64bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-9 223 372 036 854 775 808&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;9 223 372 036 854 775 807&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nagu näha omavad erinevates süsteemides täisarvud teistsuguseid väärtuste vahemikke. Kui vanade protsessoritega (16bitistega) sai opereerida täisarvudega maksimaalselt 65000 kohta, siis 32bitised protsessorid (Intel Pentiumist alates) olid võimelised juba kordades suuremate arvudega opereerima ning 64bitised (AMD Athlon 64, Intel EM64T) protsessorid on võimelised opereerima veelgi suuremate arvudega.&lt;br /&gt;
&lt;br /&gt;
Ometigi on võimalik välja kutsuda ka vanemate süsteemide muutujatüüpe, kasutades '''''__int8, __int16, __int32''''' ja '''''__int64'''''.&lt;br /&gt;
&lt;br /&gt;
Mis nende vahe on? Mälukohtade tarbimise vahe. 8bitine ja 16bitine täisarv kasutavad mõlemad 1 baidi mälust. 32bitine võtab juba 2 baiti ning 64bitine täisarv 4 baiti. Aga milles küsimus? Me ei ela ju enam 64 kilobaidi-ajastul. Aga selles on asi, et suurte programmide puhul kus ei ole mitte käputäis vaid paar(kümmend)tuhat muutujat on asi hoopis teine.&lt;br /&gt;
&lt;br /&gt;
Veel on olemas muutujatüübid nagu '''''short''''' ja '''''long'''''. '''''Short''''' ei ole tegelikult mitte midagi muud kui 16bitine täisarv vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt; ning long on 32bitine täisarv vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lisaks saab eelpool mainitud '''''short'''''’le ja '''''long'''''’le lisada eesliited '''''unsigned'''''. '''''Unsigned short''''' (kui muidu on '''''signed short''''') võib olla vahemikus 0 kuni &amp;lt;code&amp;gt;65 535&amp;lt;/code&amp;gt; ning unsigned long vahemikus 0 kuni &amp;lt;code&amp;gt;4 294 967 295&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Seejärel ujukomaarvud '''''float, double''''' ja '''''long double'''''. '''''Float''''' on kõige väiksem ujukomaarv, võtab mälus 4 baiti ning maksimaalseks suuruseks on &amp;lt;code&amp;gt;3,4*10&amp;lt;sup&amp;gt;+/-38&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Double on natuke ulatuslikum, võttes mälus 8 baiti ning vahemikuks &amp;lt;code&amp;gt;1,7*10&amp;lt;sup&amp;gt;+/-308&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Lõpuks on long double mis on neist kahest suurim (10 baiti) ning ulatuslikeim: &amp;lt;code&amp;gt;1,2*10&amp;lt;sup&amp;gt;+/-4932&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Viimaseks võiks ära mainida tekstmuutujad, millest kasutatavaim on '''''char'''''. Nimelt on char-tüüpi muutuja võimeline sisaldama endas ühte tähte. Kui temast teha massiiv, on ta ka võimeline sisaldama tervet stringi.&lt;br /&gt;
&lt;br /&gt;
=== Päisefailid ===&lt;br /&gt;
Päisefailid (headerid) on tavaliselt failid, mis sisaldavad programmi muutujaid, et hoida programmi koodis korda ja vajadusel oleks nt kindlat muutujat kerge üles leida. Peaaegu iga programmi koodis võib leida päisefaile. C++is on päisefailidel laiendiks &amp;quot;.h&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2601</id>
		<title>Sissejuhatus programmeerimisse</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Sissejuhatus_programmeerimisse&amp;diff=2601"/>
		<updated>2005-11-23T19:27:44Z</updated>

		<summary type="html">&lt;p&gt;Offf: /* Mõisted */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine]]&lt;br /&gt;
&lt;br /&gt;
== Programmeerimine ==&lt;br /&gt;
&lt;br /&gt;
Mis on programmeerimine? Programmide loomine? Jah, nii võiks ta kokku võtta küll, ent tegelikkuses ei ole asi sugugi nii lilleline ning keerulisemate programmide tegemine võib võtta aega päevadest aastateni. Suuremad programmid koosnevad miljonitest (kui mitte miljarditest) ridadest koodist ning neid on arendatud aasta(kümne)id.&lt;br /&gt;
&lt;br /&gt;
Programmeerimine koosneb tegelikult paljudest staadiumitest. Tõsi, on võimalik võtta pähe, et „oh, ma nüüd lähen ja teen kohe programmi,” ent kui tõsisemaseks programmeerimiseks läheb, siis sellisest mõtteviisist ei piisa. Programmide loomise mõned etapid on näiteks ideestaadium, disainistaadium, projekteerimise staadium ja siis tuleb alles koodimise osa.&lt;br /&gt;
&lt;br /&gt;
Lisaks on programmeerimise väga heaks eelduseks loogiline mõtlemine ning hea matemaatika. Pikemate programmide puhul tuleb kasuks ka püsivus ning tõenäoliselt mõned unetud ööd. Kui ka natuke muheleda, võiks öelda, et programmeerimine koosneb 90% matemaatikast, 9% loogika ning 0,5% kirjutamist. Ülejäänud 0,5% läheb ettenägematuteks kulutusteks.&lt;br /&gt;
&lt;br /&gt;
Teisalt pole programmeerimine ka lihtsalt mõttetu hunniku teksti kirjutamine (ning kui seda teha viletsalt, ei hakka programm üldse töölegi vaid loobib hunnikute viisi veateateid ning programmi vastu kaob huvi) või terve kuhja graafiliste vidinate kokkulöömine ideega sellest programm teha. Nii mõnedki kasulikud programmid on graafiliselt üpris inetud. Seetõttu üritame selles juhendis teha asja nii lõbusaks kui võimalik.&lt;br /&gt;
&lt;br /&gt;
== Mõisted ==&lt;br /&gt;
&lt;br /&gt;
Siinkohal mõned tähtsamad mõisted mida programmeerimises on tarvilik teada.&lt;br /&gt;
&lt;br /&gt;
*'''Muutuja''' – täht või sõna millele saab omistada väärtust, mida saab omakorda vajalikul momendil muuta. Muutujaks võib olla näiteks tikkude arv toosis – seda arvu saab muuta, või näiteks raamatus lugemata lehekülgede arv – ka see muutub. &lt;br /&gt;
*'''Konstant''' – muutumatu muutuja. Näiteks on konstant matemaatiline tähis ''pii'', ehk &amp;lt;code&amp;gt;3,1415926535897932384626433832795&amp;lt;/code&amp;gt;. See ei muutu. Või arv &amp;quot;e&amp;quot; &amp;lt;code&amp;gt;2.71828&amp;lt;/code&amp;gt;. Üldiselt on konstant mistahes arv-, sõne või tõeväärtus, mida me oleme oma programmis konstandina defineerinud ja väärtustanud. Konstandi väärtus programmi täitmise käigus muutuda ei saa. Selle poolest erineb konstant muutjast, mille väärtust on võimalik programmi täitmise käigus muuta. Erandiks on süsteemsed konstandid, mida pole vaja eraldi defineerida vaid nad on vaikimisi juba defineeritud ja Tambovi Konstant (arv mis liidetakse v6i lahutatakse, millega korrutatakse või jagatakse arvutatud tulemus, et saada soovitud tulemus). Tambovi Konstandi kasutamist peetakse üldiselt taunismisväärseks, kuid reaalsetes programmides tuleb seda liigagi tihti ette.&lt;br /&gt;
 &lt;br /&gt;
*'''Massiiv (array)''' – muutujate kogum. Raamatus on tähed ja leheküljed. Ütleme, et muutuja on lehekülg ning muutuja väärtus on lehekülje sisu. Kuna raamatus on palju lehekülgi siis kõik need leheküljed moodustavad massiivi. Ka poes müüdavad suured pakid tikutoose on tegelikult ju massiiv, sest kui tikutoos on muutuja ning tikkude arv toosis on muutuja väärtus, on need kõik toosid selles suures kilepakendis massiiv. &lt;br /&gt;
&lt;br /&gt;
*'''Kommentaar/kommenteerima''' – lõik(/lõigud) programmitekstis, mis ei leia kajastamist programmi kompileerimises. Lühidalt – kõik kommentaarid jäetakse kompileerimisel arvestamata. Näiteks võib seda kasutada juhul, kui on hirmsasti tarvis mingit osa koodist testida, ent üks teine osa jääb millegipärast ette. Kas on tõesti tarvis ettejääv osa ära koristada teelt? Ei, saab ka lihtsamini – kommenteerida lõik välja. Teisalt aitavad kommentaarid teksti selgitada. Kommentaarivaene tekst on tihtipeale kurjast. Tegelikult on ta pea kogu aeg kurjast. Kommenteerimata koodi on väga raske lugeda iseendalgi, kui kirjutamisest on palju aega möödas. Juurde aitavad küll selgitavad muutujad, ent muutujatest ei piisa. Kui kommentaare ei ole, ei pruugi kõrvalseisja välja jagada isegi seda, mida programm tegema peaks.&lt;br /&gt;
&lt;br /&gt;
''Programmeerimis keeles C++ on kommentaare kahte sorti. Ühed, mis kommenteerivad kommentaaritähise algusest rea lõpuni ning teised, mis kommenteerivad välja kasvõi terve faili kui vaja. Esimesi tähistatakse topeltkaldkriipsuga // ning teised käivad /* ja */ vahele (antud juhul oleks sõna „ja” välja kommenteeritud).&lt;br /&gt;
&lt;br /&gt;
C++ laadsed ühe rea kommentaarid on lubatud ka C99 standardis tavalises C's.''&lt;br /&gt;
&lt;br /&gt;
=== Muutuja ===&lt;br /&gt;
&lt;br /&gt;
Muutujad, nagu enne räägitud, on täht/tähed, millele saab omistada mingeid väärtusi. Ent ometigi ei saa kõikidele muutujatele ükskõik mis tüüpi väärtust omistada. Näiteks ei saa arvmuutujale omistada tekstmuutuja väärtust või täisarv-tüüpi muutujale ujukomaarv-tüüpi väärtust.&lt;br /&gt;
&lt;br /&gt;
Üldiselt on olemas päris palju erinevaid muutujatüüpe. Mõnda neist ka siinkohal lähedamalt vaatleme.&lt;br /&gt;
&lt;br /&gt;
'''''Int''''' (ehk täisarv):&lt;br /&gt;
&lt;br /&gt;
Integer-tüüpi muutujale saab omistada ainult täisarvulisi väärtusi, st näiteks 10, 150 aga ka 1239, aga ei saa omistada komaga väärtusi, nagu 27,5 või 2933,93929. Sõltuvalt süsteemist on ta võimeline saama erinevate vahemikega väärtusi.&lt;br /&gt;
&lt;br /&gt;
 '''16bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''32bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;&lt;br /&gt;
 '''64bitised süsteemid''' – vahemikus &amp;lt;code&amp;gt;-9 223 372 036 854 775 808&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;9 223 372 036 854 775 807&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nagu näha omavad erinevates süsteemides täisarvud teistsuguseid väärtuste vahemikke. Kui vanade protsessoritega (16bitistega) sai opereerida täisarvudega maksimaalselt 65000 kohta, siis 32bitised protsessorid (Intel Pentiumist alates) olid võimelised juba kordades suuremate arvudega opereerima ning 64bitised (AMD Athlon 64, Intel EM64T) protsessorid on võimelised opereerima veelgi suuremate arvudega.&lt;br /&gt;
&lt;br /&gt;
Ometigi on võimalik välja kutsuda ka vanemate süsteemide muutujatüüpe, kasutades '''''__int8, __int16, __int32''''' ja '''''__int64'''''.&lt;br /&gt;
&lt;br /&gt;
Mis nende vahe on? Mälukohtade tarbimise vahe. 8bitine ja 16bitine täisarv kasutavad mõlemad 1 baidi mälust. 32bitine võtab juba 2 baiti ning 64bitine täisarv 4 baiti. Aga milles küsimus? Me ei ela ju enam 64 kilobaidi-ajastul. Aga selles on asi, et suurte programmide puhul kus ei ole mitte käputäis vaid paar(kümmend)tuhat muutujat on asi hoopis teine.&lt;br /&gt;
&lt;br /&gt;
Veel on olemas muutujatüübid nagu '''''short''''' ja '''''long'''''. '''''Short''''' ei ole tegelikult mitte midagi muud kui 16bitine täisarv vahemikus &amp;lt;code&amp;gt;-32 768&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;32 767&amp;lt;/code&amp;gt; ning long on 32bitine täisarv vahemikus &amp;lt;code&amp;gt;-2 147 483 648&amp;lt;/code&amp;gt; kuni &amp;lt;code&amp;gt;2 147 483 648&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lisaks saab eelpool mainitud '''''short'''''’le ja '''''long'''''’le lisada eesliited '''''unsigned'''''. '''''Unsigned short''''' (kui muidu on '''''signed short''''') võib olla vahemikus 0 kuni &amp;lt;code&amp;gt;65 535&amp;lt;/code&amp;gt; ning unsigned long vahemikus 0 kuni &amp;lt;code&amp;gt;4 294 967 295&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Seejärel ujukomaarvud '''''float, double''''' ja '''''long double'''''. '''''Float''''' on kõige väiksem ujukomaarv, võtab mälus 4 baiti ning maksimaalseks suuruseks on &amp;lt;code&amp;gt;3,4*10&amp;lt;sup&amp;gt;+/-38&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Double on natuke ulatuslikum, võttes mälus 8 baiti ning vahemikuks &amp;lt;code&amp;gt;1,7*10&amp;lt;sup&amp;gt;+/-308&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Lõpuks on long double mis on neist kahest suurim (10 baiti) ning ulatuslikeim: &amp;lt;code&amp;gt;1,2*10&amp;lt;sup&amp;gt;+/-4932&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Viimaseks võiks ära mainida tekstmuutujad, millest kasutatavaim on '''''char'''''. Nimelt on char-tüüpi muutuja võimeline sisaldama endas ühte tähte. Kui temast teha massiiv, on ta ka võimeline sisaldama tervet stringi.&lt;br /&gt;
&lt;br /&gt;
=== Päisefailid ===&lt;br /&gt;
Päisefailid (headerid) on tavaliselt failid, mis sisaldavad programmi muutujaid, et hoida programmi koodis korda ja vajadusel oleks nt kindlat muutujat kerge üles leida. Peaaegu iga programmi koodis võib leida päisefaile. C++is on päisefailidel laiendiks &amp;quot;.h&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=V%C3%B5rgu%C3%BChenduse_kontrollimine&amp;diff=2540</id>
		<title>Võrguühenduse kontrollimine</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=V%C3%B5rgu%C3%BChenduse_kontrollimine&amp;diff=2540"/>
		<updated>2005-11-13T10:26:09Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Võrgukihi juhendid]]&lt;br /&gt;
See sobib kasutamiseks siis kui mis iganes põhjustel ei ole võimalik võrguühenduse olemasolu operatsioonisüsteemi seirevahenditega seirata. Mõeldud kasutamiseks Microsoft'i operatsioonisüsteemis.&lt;br /&gt;
&lt;br /&gt;
'''1.Käivitatava faili loomine''' &lt;br /&gt;
Selleks sobib näiteks  [http://en.wikipedia.org/wiki/BAT_file Batch file]&lt;br /&gt;
Batch faili loomiseks on kõige sobivam lihtne tekstiredaktor. Näiteks kas notepad või edit. &lt;br /&gt;
failis peab olema järgmine.&lt;br /&gt;
&lt;br /&gt;
    REM Pingib teenusepakkuja lüüsi lisab pingimise kellaaja ja kuupäeva ning kirjutab tulemused &amp;lt;br&amp;gt; tekstifaili.&lt;br /&gt;
    &lt;br /&gt;
    ping ''[siia kirjuta oma teenusepakkuja lüüsi IP aadress]'' &amp;gt;&amp;gt; tulemus.txt&lt;br /&gt;
    date /T &amp;gt;&amp;gt; tulemus.txt&lt;br /&gt;
    time /T &amp;gt;&amp;gt; tulemus.tst&lt;br /&gt;
&lt;br /&gt;
fail tuleb salvestada laiendiga .bat&lt;br /&gt;
&lt;br /&gt;
Selle toimimist saab kontrollida käivitades faili kas käsurealt või failihaldurist.&lt;br /&gt;
&lt;br /&gt;
Edukal käivitamisel peab tulemus.txt sisu välja nägema umbes selline :&lt;br /&gt;
&lt;br /&gt;
    T 08.11.2005 &lt;br /&gt;
    09:58&lt;br /&gt;
    Pinging neti.ee [194.126.101.79] with 32 bytes of data:&lt;br /&gt;
    Reply from 194.126.101.79: bytes=32 time=10ms TTL=58&lt;br /&gt;
    Reply from 194.126.101.79: bytes=32 time=12ms TTL=58&lt;br /&gt;
    Reply from 194.126.101.79: bytes=32 time=13ms TTL=58&lt;br /&gt;
    Reply from 194.126.101.79: bytes=32 time=14ms TTL=58&lt;br /&gt;
    Ping statistics for 194.126.101.79:&lt;br /&gt;
         Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),&lt;br /&gt;
    Approximate round trip times in milli-seconds:&lt;br /&gt;
         Minimum = 10ms, Maximum = 14ms, Average = 12ms&lt;br /&gt;
&lt;br /&gt;
Uuemate Windowside käsuinterpretaator on pisut võimekam. Järgenev CMD fail töötab kindlasti Windows XP ja 2K3 keskkonnas, võimalik, et ka W2K keskkonnas. Soovitav on faili nimeks panna CMD, mitte BAT, sest siis teab Windows, et faili interpreteerimiseks tuleb kasutada laiendatud võimalustega käsuinterpretaatorit&lt;br /&gt;
&lt;br /&gt;
 @FOR /F &amp;quot;usebackq tokens=*&amp;quot; %%A IN (`ping -n 1 host-mida-tahame-pingida ^| sort`) DO @SET ANS=%%A&lt;br /&gt;
 @ECHO %DATE% %TIME% &amp;quot;%ANS%&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Annab umbes seesuguse väljundi&lt;br /&gt;
&lt;br /&gt;
 P 11/13/2005 12:08:34,06 &amp;quot;Reply from 192.168.1.1: bytes=32 time&amp;lt;1ms TTL=255&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Sedasi satub iga vastus ilusasti koos kuupäeva ja kellaajaga oma reale ja seda faili on oluliselt mugavam töödelda. NB! kuna Windowsi tekstiparser on pehmelt öeldes &amp;quot;piiratud&amp;quot;, siis ei tohiks ping käsu n-parameetrit muuta. Kui hosti soovitakse mitu korda pingida tuleks terve ülalviidatud koodilõik asetada käsuskripti (näiteks png.cmd) ja kutsuda välja teisest käsuskriptist FOR tsükli abil. &lt;br /&gt;
&lt;br /&gt;
fail mpng.cmd&lt;br /&gt;
 @FOR /L %%I IN (1,1,3) DO @PNG.CMD&lt;br /&gt;
&lt;br /&gt;
fail png.cmd&lt;br /&gt;
 @FOR /F &amp;quot;usebackq tokens=*&amp;quot; %%A IN (`ping -n 1 192.168.1.1 ^| sort`) DO @SET ANS=%%A&lt;br /&gt;
 @ECHO %DATE% %TIME% &amp;quot;%ANS%&amp;quot; &amp;gt;&amp;gt; ans.txt&lt;br /&gt;
&lt;br /&gt;
fail ans.txt (tekib meile)&lt;br /&gt;
 P 11/13/2005 12:31:05,37 &amp;quot;Reply from 192.168.1.1: bytes=32 time&amp;lt;1ms TTL=255&amp;quot; &lt;br /&gt;
 P 11/13/2005 12:31:05,50 &amp;quot;Reply from 192.168.1.1: bytes=32 time&amp;lt;1ms TTL=255&amp;quot; &lt;br /&gt;
 P 11/13/2005 12:31:05,60 &amp;quot;Reply from 192.168.1.1: bytes=32 time&amp;lt;1ms TTL=255&amp;quot; &lt;br /&gt;
&lt;br /&gt;
On siililegi selge, et pingimiskordade arvu muudame me failis mpng mängides IN seti kolmanda parameetriga, mis hetkel omab väärtust &amp;quot;3&amp;quot;. Samuti on soovitav näites toodud IP aadress vahetada selle IP aadressi vastu mida soovime pingida.&lt;br /&gt;
&lt;br /&gt;
'''2. Faili perioodiline käivitamine'''&lt;br /&gt;
Perioodiliseks käivitamiseks on mõistlik kasutada Windowsi operatsioonisüsteemis olevat Task Sheduleri.&lt;br /&gt;
Kiirtee seadistaja leidmiseks ja käivitusrutiini loomiseks on järgmine Start menüü &amp;gt; programs &amp;gt; Accessories &amp;gt; System tools &amp;gt; Scheduled Tasks &amp;gt; Add Scheduled Task.&lt;br /&gt;
&lt;br /&gt;
Käivitatavaks programmiks on eelnevalt loodud Batch fail.&lt;br /&gt;
Detailne seadistamine sõltub kasutatavast operatsioonisüsteemist ning sellega tutvumiseks on soovitav kasutada operatsioonisüsteemi spikrit (help).&lt;br /&gt;
&lt;br /&gt;
'''Praktilised näpunäited:'''&lt;br /&gt;
Teenusepakkuja lüüsi pingimine on soovitatav selle pärast, et kui te pingite suvalist hosti internetis ei ole tulemuseks mitte see kas teie ühendus on töökorrast vaid kas see host on töökorras. Samuti ei pruugi see anda ka ikkagi reaalseid tulemusi kuna tegelikuses on teenusepakkuja arvutivõrgu infrastruktuur keerulisem ning viga võib olla ka tekkinud peale esimest lüüsi.&lt;br /&gt;
Testi liiga tihe käivitamine pika ajajooksul (näiteks iga  minuti tagant) ei pruugi anda soovitud tulemusi ning võib hoopis vähendada võrguühenduse läbilaskevõimet või operatsioonisüsteemi jõudlust.&lt;br /&gt;
&lt;br /&gt;
Autor: [http://foorum.hinnavaatlus.ee/profile.php?mode=viewprofile&amp;amp;u=12170 silverk]&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rguanal%C3%BCsaatori_ehitamine&amp;diff=2482</id>
		<title>Lihtsa võrguanalüsaatori ehitamine</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Lihtsa_v%C3%B5rguanal%C3%BCsaatori_ehitamine&amp;diff=2482"/>
		<updated>2005-11-03T18:38:11Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Kasulikud Näpunäited]]&lt;br /&gt;
[[Kategooria:Andmeside]]&lt;br /&gt;
[[Kategooria:Võrgukihi juhendid]]&lt;br /&gt;
&lt;br /&gt;
==Lihtsa Võrguanalüsaatori Ehitamine võrguprobleemide tuvastamiseks==&lt;br /&gt;
&lt;br /&gt;
Ilmselt on mõistlik tutvust teha Ethereali ( http://www.ethereal.com ) nimelise programmiga (võib kasutada ka mõnda teist võrguanalüsaatorit, näiteks tcpdump), mille abil tasuks uurida nii &amp;quot;sisevõrgu&amp;quot; masinasse tulevat (ning ehk ka väljuvat) liiklust kui ka seda liiklust, mis toimub kaablimodemi ning NAT'iva routeri vahel.&lt;br /&gt;
&lt;br /&gt;
Sisevõrgus olevasse masinasse saabuvat liiklust saab analüüsida sisevõrgu masinas endas, kaablimodemi ning routeri vahelise liikluse analüüsimiseks on kõige lihtsam laenata või osta HUB (kindlasti hub, mitte switch), mille abil siis ühendada sellesse võrku veel üks seade, mis kuulab seda liiklust pealt.&lt;br /&gt;
&lt;br /&gt;
Testimiseks on kõige lihtsam hankida ligipääs mõnesse Internetis asuvasse Unixilaadsesse süsteemi (paremal puudumisel võib ju muidugi ka naabrimees või keegi teine oma lauaarvutist üritada ühenduda), mille aadress (ma mõtlen reaalne interneti aadress) on teada. Teadaolev Internetis asuva süsteemi aadress anda etherealile filtriks kujul ip.addr == aadress (see konstruktsioon määrab filtrisse nii sellelt aadressilt tulevad kui ka sellele aadressile saadetavad paketid). Kaval on Etherealile öelda, et kõik paketid, mis püütakse, ka kohe välja näidataks (loomulikult on sellisel juhul mõistlik, kui võrgu peal on nii vähe liiklust kui võimalik).&lt;br /&gt;
&lt;br /&gt;
Olles sedasi analüsaatori püsti saanud (ahjaa promisc moodis (sellisel juhul edastab võrgukaart OSile ka selle liikluse, mis ei ole talle mõeldud, vajalik kaablimodemi ja routeri vahelise liikluse pealt kuulamiseks) kuulamiseks on reeglina vaja superkasutaja õigusi), tuleks luua väljastpoolt ühendus oma välisaadressi sellesse porti, kus me eeldame teenust olevat. Kõige lihtsam on seda teha telneti abil: telnet 1.2.3.4 1234, kus 1.2.3.4 on ip aadress ning 1234 on vastav TCP port.&lt;br /&gt;
Algatuseks on mõistlik kuulata teenust pakkuvast masinast - kui välisilmast ühendust luues filtrisse ühtegi paketti ei tulnud, on ilmselge, et viga tuleb otsida routerist(vt. ka allapoole nn. &amp;quot;keerulisem olukord&amp;quot;). Kui aga ühendus ilmub, tuleb hakata analüüsima, mis siis valesti on.&lt;br /&gt;
&lt;br /&gt;
Et asjatundmatu kasutaja ei pruugi esimese hooga Ethereali väljundist suurt midagi aru saada, siis toome siinkohal ühe pisikene näite õnnestunud ühendusest (ehk siis... nõnda peavad asjad olema, kui ei ole, on analoogia põhjal ilmselt üsna lihtne oletada, mis on valesti):&lt;br /&gt;
&lt;br /&gt;
Olukord on järgmine: võrgu väline (reaalselt eksisteeriv) interneti aadress on 217.159.159.181, millel vastab router, milles on TCP/666 DNAT'itud &amp;quot;sisevõrgus&amp;quot; asuva masina, aadressiga 192.168.2.20, pordile TCP/22, millelt vastab SSH. Selle teenusega üritatakse ühendust võtta süsteemist aadressiga 194.204.19.34 järgmiselt:&lt;br /&gt;
&lt;br /&gt;
wookie@piixus:~$ telnet 217.159.159.181 666&lt;br /&gt;
Trying 217.159.159.181...&lt;br /&gt;
Connected to 217.159.159.181.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
SSH-2.0-OpenSSH_3.9p1&lt;br /&gt;
^]&lt;br /&gt;
telnet&amp;gt; quit&lt;br /&gt;
Connection closed.&lt;br /&gt;
&lt;br /&gt;
Sisevõrgus asuva masina seisukohalt näeb ühendus välja järgmine: http://rio.ee/~wookie/tcp-yhendus.png&lt;br /&gt;
ISP ning minu routeri vahel toimus samal ajal aga järgmine: http://rio.ee/~wookie/tcp-yhendus-valine.png&lt;br /&gt;
&lt;br /&gt;
Olulised on siinkohal kolm esimest paketti:&lt;br /&gt;
Iga TCP ühendus algab ühenduse alustaja poolt saadetud [SYN] paketiga. Me märkame, et sisevõrgu masina jaoks on paketi sihtaadress (destination adress) 192.168.2.20, kuid teiselt pildilt näeme, et tegelikult saabus pakett muidugi aadressile 217.159.159.181 - router transleeris paketi sihtaadressi selliselt, et see sai edasi liikuda meie privaatvõrgu aadressile, samuti me märkame, et antud juhul jättis router paketi lähteaadressi (source address) muutmata. Samasugust transleerimist võime tähele panna pordi numbritega - routerisse saabus pakett pordile TCP/666, kuid sisevõrgu masinasse pordile TCP/22 (ssh).&lt;br /&gt;
&lt;br /&gt;
Kuna [SYN] pakett saabus antud juhul õige masina õigesse porti (sellisesse, mida mõni teenus kuulab), vastab meie masin [SYN, ACK] paketiga, antud juhul aadressile 194.204.19.34 (sealt ju ühendus tuli). Nüüd on äärmiselt oluline uurida, kas see pakett routerist 194.204.19.34 aadressile välja ikka saadeti. Vaatame välise ühenduse pilti ning näeme, et router saatis [SYN, ACK] paketti aadressilt 217.159.159.181 aadressile 194.204.19.34, samal ajal kui meie sisevõrgus olev masin hoopis aadressilt 192.168.2.20 aadressile 194.204.19.34 - loogiline, pakett peab antud juhtumil väljuma routeri source aadressiga, ehk siis reaalselt internetis eksisteeriva aadressiga. Kui paketi lähteaadress oleks teistsugune, näiteks 192.168.2.20, ei oleks ühenduse loomine õnnestunud, sest ühendust algatava masina jaoks oleks see olnud kui SYN,ACK pakett mingilt täiesti tundmatult aadressilt, millega ta pole kunagi üritanud suhelda. Seda, et meie routeris 217.159.159.181'st saab maagiliselt 192.168.2.20, 194.204.19.34 ei tea ega saa ka kunagi teadma. Samuti, täpselt samasugune transleerimine toimub pordinumbritega - sisevõrgu masin vastab pordist (source port) TCP/22 (ssh), kuid routerist väljuv pakett lähtub pordist TCP/666.&lt;br /&gt;
&lt;br /&gt;
Kui siiamaale juba asjad õnnestusid, siis üldiselt õnnestub ka TCP ühenduse loomiseks vajaliku kolmanda paketi (ühenduse algataja poolne vastus [ACK] &amp;quot;serveri&amp;quot; [SYN, ACK]'le) saatmine. Me märkame, et selle paketiga käitutakse sarnaselt päris esimesele paketile.&lt;br /&gt;
&lt;br /&gt;
Sellest hetkest alates on ühendus loodud ning järgneb juba data: Server (meie näites siis sisevõrgus olev masin) ütleb: &amp;quot;SSH-2.0-OpenSSH_3.9p1&amp;quot;. Mida kliendis jooksev applikatsioon sellega peale hakkab, on juba tema enda mure - meie näites kasutatav telnet ei oska sellega mitte mütsigi teha, kuid kuna me juba nägime serveri poolset vastust, oleme me veendunud, et ühendust on võimalik luua ning paneme telneti hoopis kinni (mis toimub ühenduse sulgemisel võib igaüks ise jälgida, uurides kolme viimast paketti). Ahjaa.. küsite, et mida kuradit teeb siis viies, [ACK] pakett? See on lihtsalt kliendi poolne vastus, et ta sai eelmises paketis saadetud teate (SSH-2.0-OpenSSH_3.9p1) kenasti kätte.&lt;br /&gt;
&lt;br /&gt;
Ma usun, et igaüks teab aga igaks juhuks kordame veel üle, et iga sellise NAT'itud ühenduse peale teeb router kuhugile oma mälus asuvasse tabelisse kirje, milles on kirjas, mida täpselt muudeti ning oskab selle järgi vastassuunas liikuvate pakettide välju vastupidiselt muuta, et kõik ikka õnnelikud oleks - kuidas see käib, pole antud hetkel meie asi, lihtsalt jätame meelde, et selline tabel kuskil routeri kõhus on.&lt;br /&gt;
&lt;br /&gt;
Tähelepanelik lugeja kindlasti märkab, et suunal klient (kuskil interneti avarustes asuv purk) -&amp;gt; server (meie sisevõrgu masin) muudeti ainult pakettide sihtaadressi (destination address) ning suunal server -&amp;gt; klient ainult paketi lähteaadressi (source address). Enamik selliseid pordisuunamisi töötab selliselt. Niisuguses lahenduses, kus sisevõrgust interneti poole suunduvate pakettide lähteaadressi tuleb nii ehk naa transleerida, pole mõtet vastupidise NAT'i korral välisilmast saabuvate pakettide lähteaadressi muuta.&lt;br /&gt;
&lt;br /&gt;
Samas... eksisteerib ka keerulisem olukord - router muudab nii siseneva paketi lähte- kui ka sihtaadressi. Sellisel juhul jääb meie sisevõrgus olevale serverile mulje nagu ta suhtleks routeri endaga. Niisugusel juhul sisevõrgus filter ip.addr == ip_aadress ei kõlba (sest sisevõrgus ju mitte keegi ei suhtle selle välise aadressiga) ning tuleks asendada keerulisema filtriga, minu puhul siis näiteks: ip.addr == 192.168.2.254 (192.168.2.254 on minu routeri sisevõrgu aadress, me püüame liiklust, mida peetakse selle seadmega) või suisa ip.addr == 192.168.2.254 &amp;amp;&amp;amp; tcp.port == 22 (TCP liiklus, mida peetakse routeriga, mille lähte- või sihtport on 22). Igaks juhuks ühest sellisest ühendusest pilt kah (vaadatuna siis sisevõrgu masina poolt - väljastpoolt ei muutu midagi) http://rio.ee/~wookie/tcp-yhendus-full-nat.png&lt;br /&gt;
&lt;br /&gt;
Üldiselt peaks nendest teadmistest piisama, et lihtsamate pordisuunamise probleemide põhjuseid diagnoosida. Tavaliselt, kui sellist õnnestunud ühendust võrrelda ebaõnnestunud ühenduse korral püütud pakettidega, hakkab viga vähegi tähelepaneliku süvenemise korral ise silma ning parandamine on tavaliselt juba triviaalne tegevus.&lt;br /&gt;
Keerukamate probleemide korral võib muidugi ka Õpetatud Kogu[tm] tunde või suisa päevi ladinakeeles päid vangutada, et välja mõelda, mis siis ikkagi peetis on, kuid praktika näitab, et enamik probleeme on tegelikult lihtsad.&lt;br /&gt;
&lt;br /&gt;
Tjah, kindlasti tasub meeles pidada, et Ethereal oskab püütud pakette salvestada (jah, just nimelt File::Save) - sellised ethereali failid võivad probleemide lahendamisel vägagi abiks olla, mistõttu maksab selliste hädade korral abiküsimise kõrvalt ka mõni niisugune Ethereali fail kätesaadavaks teha.&lt;br /&gt;
Et kõik saaks ise uurida, siis juurde ka antud näites kasutatud ühenduste salvestused:&lt;br /&gt;
http://rio.ee/~wookie/tcp-yhendus&lt;br /&gt;
http://rio.ee/~wookie/tcp-yhendus-valine&lt;br /&gt;
http://rio.ee/~wookie/tcp-yhendus-full-nat&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
Jah ma tean küll, et antud juhul ei ole routerist rääkimine päris korrektne, sest klassikaline router ei muuda edastatavates pakettides ei IP aadresse ega pordi numbreid, kuid antud juhul, kuna probleem on selgelt seotud NAT'iga, tundus sõna router kasutamine otstarbekam, sest NAT'iv router või NAT'i purk vms. oleks lihtsalt kohutavalt kohmakas.&lt;br /&gt;
Seega lugege sõna &amp;quot;router&amp;quot; antud juhul kui &amp;quot;see router selles konkreetses seadistuses võrguaadresse transleerimas (NAT)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
P.P.S.&lt;br /&gt;
Ehki meie kasutasime näites SSH teenust, mis peale ühenduse loomist ise mingit mula välja hakkab ajama, ei prugi sellist igaühel käepärast olla. Sageli on tarvis testida näiteks WWW (TCP/80) teenuse töötamist, mille puhul server jääb peale ühenduse loomist ootama, et talle mõni käsk antaks. Sellisel juhul on mõistlik telneti sisse peale ühenduse saamist kirjutada suvaline esimesena meelde tulev vandesõna või roppus ning taguda paar korda enterit. WWW server peab vastama HTML'iga, mis tahab meile öelda, et 501 Method Not Implemented või midagi muud sama roppu.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Kategooria:F%C3%BC%C3%BCsilise_kihi_juhendid&amp;diff=1983</id>
		<title>Kategooria:Füüsilise kihi juhendid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Kategooria:F%C3%BC%C3%BCsilise_kihi_juhendid&amp;diff=1983"/>
		<updated>2005-10-21T11:35:10Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Kasulikud Näpunäited]]&lt;br /&gt;
[[Kategooria:Andmeside]]&lt;br /&gt;
&lt;br /&gt;
Jutud sellest, mis &amp;quot;purk&amp;quot; mida teha oskab ja milleks hea on, kaablitest ja nende valmistamisest, võrgutopoloogiatest ja tehnoloogiatest. Jutud WiFi füüsilisest poolest - antennid, kaablid, mastid.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=V%C3%B5rguseadmete_t%C3%BC%C3%BCbid_ja_liigitus&amp;diff=1982</id>
		<title>Võrguseadmete tüübid ja liigitus</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=V%C3%B5rguseadmete_t%C3%BC%C3%BCbid_ja_liigitus&amp;diff=1982"/>
		<updated>2005-10-21T11:28:36Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Kasulikud Näpunäited]]&lt;br /&gt;
[[Kategooria:Andmeside]]&lt;br /&gt;
[[Kategooria:Füüsilise kihi juhendid]]&lt;br /&gt;
&lt;br /&gt;
==Mis on hub, router, switch...==&lt;br /&gt;
&lt;br /&gt;
Võtaks ette järjekordse segase asja, kõik need kaablipuntrasse mattunud lapikud kastid kapinurgas ja muu võrgundusega seotud kraami, ja prooviks neist mingi lihtsurelikule arusaadava süsteemi moodustada. Seda ülesannet raskendab tootjate omavaheline kemplemine, mis muuhulgas väljendub sama asja nimetamises eri nimedega, ning tehnika järelejätmatu areng, mis tingib sõnade tähenduse kiire nihkumise. Kuid proovime siiski, abiks sõnastikud ja standardid.&lt;br /&gt;
Lihtsaim&lt;br /&gt;
&lt;br /&gt;
Alustame kõige lihtsamast võrgust: kaks arvutit on omavahel ühendatud kaabli abil. Laskumata üksikasjadesse selle kaabli iseloomu või teda mööda liikuvate protokollide kohta, võime öelda, et lisaks arvutitele ja kaablile läheb kummagi arvuti juures tarvis veel üht asja: võrguadapterit (network adapter, network interface card, NIC). See on tavaliselt lisaplaadina, sülearvutite jaoks sageli ka PC-kaardina realiseeritud või siis emaplaadile integreeritud seade, mis ühendab arvuti (või muu seadme, näiteks printeri) kohtvõrguga. Kasutaja jaoks on võrguadapterist näha enamasti vaid pistikud, kas siis telefonipistikut meenutav RJ-45 telefonikaablit meenutava bifilaarkaabli (twisted-pair cable) jaoks või teleri antennipistikut meenutav BNC antennikaablit meenutavale koaksiaalkaablile (coaxial cable). Muuseas, bifilaarkaabli kohta ütlevad paljud keerdpaar (twisted pair, sünonüüm bifilaar), mis on vaid veidi ebatäpne. Asi selles, et kaablis võib olla ja nt telefonikaablis enamasti ongi mitu paari. Keerdpaar tähistab rangelt võttes üht sellist paari ja bifilaarkaabel kogu kaablit koos võimalike kaitsekihtide ja muuga.&lt;br /&gt;
&lt;br /&gt;
Igal asjal on piirid, muuhulgas ka kaabli pikkusel. Kui arvutid asuvad teineteisest liiga kaugel, paneme vahele järguri ehk repiiteri (repeater), mis võimendab ja puhastab signaali enne edastamist. Järgur töötab OSI protokollistiku kõige madalamal, füüsilisel tasemel, ega tea midagi edastatavatest andmetest. Tema võimendab elektrilisi impulsse.&lt;br /&gt;
&lt;br /&gt;
Arendame võrku edasi ning&lt;br /&gt;
lisame veel ühe arvuti.&lt;br /&gt;
&lt;br /&gt;
Kõige odavam viis seda teha on asendada tavaline järgur mitmepordilise järguri ehk jaoturiga (multiport repeater, hub), mis erineb järgurist peamiselt portide arvu poolest - tal on neid 8, 16 vms.&lt;br /&gt;
&lt;br /&gt;
Jaotureid on mitmesuguseid. Lihtsaim ehk passiivne jaotur (passive hub) käitub sisuliselt harukarbina, kuid tänapäeval on rohkem levinud mitmesugused edasiarendused, kus lisatud on haldus- ja seirefunktsioone - aktiivsed jaoturid (intelligent hub, manageable hub).&lt;br /&gt;
&lt;br /&gt;
Kui anda jaoturile ka aadresside lugemise võime ning panna ta edastama saadetisi ainult vajalikele portidele, saame kommuteeriva jaoturi (switching hub).&lt;br /&gt;
&lt;br /&gt;
Token Ringi võrgus kasutatakse jaoturi kohta ka lühendit MAU (Multistation Access Unit). Etherneti võrgus tähendab MAU jälle midagi muud - Media Access Unit on seal sama mis transiiver (tranceiver) ehk see tavaliselt võrguadapteri koosseisu kuuluv lülitus, mis otseselt saadab signaale võrgukaablisse ja võtab neid sealt vastu.&lt;br /&gt;
&lt;br /&gt;
Sageli kasutatakse jaoturite kohta veel sõna kontsentraator (concentrator, shared media concentrator). See on samuti põhimõtteliselt õige, sest jaotur on üks kontsentraatori liike. Viimane sõna on tegelikult palju vanem ja tähistab kanalite koondamisega tegelevat seadet üldisemas mõttes, mh nt seadet, mis Interneti teenusepakkuja juures surub üksikud modemiliinid kiiremale rendiliinile kokku.&lt;br /&gt;
Kui võrk kasvab&lt;br /&gt;
&lt;br /&gt;
Lihtsuse huvides eeldame, et kohtvõrgu protokoll on Ethernet. See protokoll töötab liikluse ja põrke tuvastamise abil, st iga jaam üritab saata, kui tal tekib selleks vajadus ning kandja on parajasti vaba. Iga saadet kuulevad kõik teised jaamad. Kui kaks jaama saadab ühel ajal, tekib põrge (collision), mõlemad lõpetavad saatmise, ootavad juhusliku ajavahemiku ja proovivad uuesti, lootuses et teine jaam ootas teistsuguse aja.&lt;br /&gt;
&lt;br /&gt;
Nii lihtsaima kahearvutilise võrgu kui ka kontsentraatori kasutamise puhul jagavad kõik jaamad ühist edastuskeskkonda, teiste sõnadega kuuluvad samasse põrkedomeeni (collision domain) - kõigi jaamade saatekatsed võivad üksteisega põrkuda. Kui võrgu koormatus (utilization) on suurusjärgus paar-kolmkümmend protsenti või alla selle, siis töötab süsteem hästi. Koormuse kasvades hakkavad üha olulisemat osa võrguliiklusest moodustama põrked, tehes võrgu lõpuks täiesti töövõimetuks.&lt;br /&gt;
&lt;br /&gt;
Lahendus on jaotada võrk väiksemateks segmentideks (segment) ning edastada ühest segmendist teise ainult see osa liiklusest, mis tõesti on sinna adresseeritud. Kui segmendid mõistlikult koostada, püsib enamus liiklust ühe segmendi (nt osakonna või projektirühma) piires ning võrgu kõigi osade koormatus langeb korralikku funktsioneerimist võimaldavale tasemele. Segmenteerimist võimaldavad seadmed on kommutaatorid, sillad ja marsruuterid.&lt;br /&gt;
&lt;br /&gt;
Kommutaator (switch) istub kohtvõrgu keskel umbes nagu ülalvaadeldud kontsentraator, kuid edastab liiklust ainult nendele portidele, mis seda vajavad. Kommutaatori porti võib olla ühendatud kas üksainus jaam, mitmest jaamast koosnev jaoturiga segment, või teine kommutaator. Kommutaator töötab OSI mudeli teisel, lülikihil.&lt;br /&gt;
&lt;br /&gt;
Niisiis, kommutaator ühendab lahti põrkedomeenid, vähendades põrgete arvu. Kuid levisaated (broadcast) ja multisaated (multicast), vastavalt kohtvõrgu kõigile või mitmele andmejaamale adresseeritud saadetised, jõuavad ikka kogu võrguni. See pole suure võrgu puhul vältimatult hea, sest selliste saadetistega peavad siis tegelema kogu võrgu kõik jaamad. Kui niisugune liiklus hakkab üle pea kasvama, võib võrgu segmenteerida ka selles mõttes - jaotada ta eri levidomeenideks (broadcast domain). Mängu tulevad marsruuterid.&lt;br /&gt;
Marsruuter&lt;br /&gt;
&lt;br /&gt;
(router) on funktsionaalüksus, mida üldjuhul kasutatakse kohtvõrkude ühendamiseks kaugvõrgu kaudu. Kuna punktist A punkti B pääseb enamasti rohkem kui üht teed mööda, siis tegelevad marsruuterid ka parima tee valimisega, vahetades selleks omavahel marsruutimisinfot. Tee headust mõõdetakse muuhulgas hüpete ehk hoppide arvuga (hop) - see on algus- ja lõpp-punkti vahele jäävate marsruuterite arv.&lt;br /&gt;
&lt;br /&gt;
Muuseas, sõna router hääldus &amp;quot;ruuter&amp;quot; pärineb briti inglise keelest. Ameeriklased ütlevad &amp;quot;rauter&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Marsruuter võib olla realiseeritud kas riistvaras või tarkvaras. Alguses olid levinud viimased, st marsruuter oli lihtsalt ühendatavates arvutites töötav firmapärane tarkvarajupp, mis oskas ümber käia selle konkreetse süsteemi protokollidega. Seejärel said populaarseks universaalsed riistvaralised marsruuterid, kuid nüüd hakkab ajaloospiraalile jälle täisring peale saama: esiteks on protsessorid piisavalt kiired, et marsruutimisega muu töö kõrvalt hakkama saada, ja teiseks on protokollide paljusus kokku kuivanud, väga paljudele piisab IP-st ja IPX-ist.&lt;br /&gt;
&lt;br /&gt;
Marsruuterid töötavad OSI mudeli kolmandal, võrgukihil. See tähendab, et nad saavad aru kaadrites sisalduvatest pakettidest ning on võimelised neid &amp;quot;ümber pakendama&amp;quot;. Näiteks kui Token Ringi pordilt tuleb sisse IPX-pakett Token Ringi kaadris, siis marsruuter oskab selle paketi väljastada Etherneti kaadris Etherneti pordile. Pakettide endi sisu kallale marsruuterid üldjuhul ei kipu.&lt;br /&gt;
Sillad ja muud&lt;br /&gt;
&lt;br /&gt;
Kui aga on kasutusel mittemarsruuditav (non-routable) protokoll, mis tähendab, et kaadris pole antud sihtaadressi ilmutatud kujul, vaid kasutatakse jaamade kokkuleppelisi nimesid (nende kokkuleppimiseks läheb siis tarvis levisaadet), siis selle kaadritega ei oska marsruuter midagi peale hakata. Mittemarsruuditavad on näiteks SNA ja NetBEUI, mis olid algselt mõeldud kasutamiseks ühe kohtvõrgu piires. Levinud viis nende protokollide edastamiseks suuremates võrkudes on silla (bridge) kasutamine. Sild on lülikihi (OSI mudeli 2. kiht) seade, mis vaatab kaadrit kui tervikut ega tea midagi selle sisu kohta.&lt;br /&gt;
&lt;br /&gt;
Seade, mis käitub olenevalt protokollist kas silla või marsruuterina, on brauter (brouter, bridge/router).&lt;br /&gt;
&lt;br /&gt;
Marsruuteri ja kommutaatori omadused on ühendatud mitmekihilises kommutaatoris (multilayer switch). Need moodsad ja läbinisti riistvaras realiseeritud seadmed saavad hakkama väga kiire marsruutimisega. Nende modifikatsioon on vookommutaator (flow switch), mis töötab nagu tavaline tarkvaraline marsruuter võrgukihil, kuid otsib andmete hulgast &amp;quot;voogusid&amp;quot; - suurt hulka samast allikast samasse sihtkohta liikuvaid pakette. Voo leidmisel langeb seade OSI mudelis taseme võrra allapoole ning rakendab voo kestmise ajaks tööle riistvaras realiseeritud kommutaatori.&lt;br /&gt;
&lt;br /&gt;
Kui liikuda marsruuterist teisele poole, üles OSI mudelis, siis jõuame lüüsini (gateway, protocol converter). See rakenduskihi seade oskab lahti võtta ka pakette, näiteks teisendada andmeid IPX-i ja TCP/IP vahel.&lt;br /&gt;
No nii,&lt;br /&gt;
&lt;br /&gt;
saidki tähtsamad lapikud kastid üles loetud. Siintoodud ei ole siiski mingid absoluutsed definitsioonid ning teatud kontekstides võidakse neid sõnu kasutada hoopis teistes tähendustes. Näiteks mõned aastad tagasi nimetas Novell sillaks seda, mida praegu peetakse marsruuteriks. Ka TCP/IP lüüs on praeguse arusaama järgi marsruuter.&lt;br /&gt;
&lt;br /&gt;
Firmade arendusosakonnad töötavad muidugi edasi, luues omavahel võistlevaid lahendusi, andes neile kummalisi, sageli konfliktseid nimesid ja üritades neid standardiks kuulutada.&lt;br /&gt;
&lt;br /&gt;
Kasutatud kirjandus&lt;br /&gt;
&lt;br /&gt;
1. Shnier, M., Computer Dictionary, Que 1998&lt;br /&gt;
&lt;br /&gt;
2. Dictionary of Computing, Oxford University Press 1997&lt;br /&gt;
&lt;br /&gt;
3. ISO/IEC 2382-25 (Eesti standardi projekt)&lt;br /&gt;
&lt;br /&gt;
4. PC Webopedia&lt;br /&gt;
&lt;br /&gt;
Tänan Arne Ansperit ja Vello Hansonit märkuste eest.&lt;br /&gt;
&lt;br /&gt;
Kopeeritud [mailto:info@imprimaatur.ee Arvi Tavasti] [http://www.imprimaatur.ee/artiklid/spik9809.html artiklist]. &lt;br /&gt;
Autor on andnud [http://wiki.hinnavaatlus.ee/index.php?title=Arvi_tavasti_luba loa] antud artikli wikisse paigutamiseks täiendamiseks ja parandamiseks.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Arvi_Tavasti_luba&amp;diff=1981</id>
		<title>Arvi Tavasti luba</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Arvi_Tavasti_luba&amp;diff=1981"/>
		<updated>2005-10-21T11:25:30Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; From: &amp;quot;Arvi Tavast&amp;quot; &amp;lt;arvi@imprimaatur.ee&amp;gt;&lt;br /&gt;
 To: &amp;quot;'Andres Septer (Offf)'&amp;quot; &amp;lt;offf@perses.net&amp;gt;&lt;br /&gt;
 Subject: RE: Imprimaaturis avaldatud materjalide kasutamine&lt;br /&gt;
 Date: Fri, 21 Oct 2005 09:42:52 +0200&lt;br /&gt;
&lt;br /&gt;
 Jah, tohib k=FCll, lootuses et keegi siis sealsed vead ja vananemised =&lt;br /&gt;
 (ikkagi aasta 98) =E4ra parandab.&lt;br /&gt;
 Arvi=20&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; -----Original Message-----&lt;br /&gt;
 &amp;gt; From: Andres Septer (Offf) [mailto:offf@perses.net]=20&lt;br /&gt;
 &amp;gt; Sent: Thursday, October 20, 2005 7:50 PM&lt;br /&gt;
 &amp;gt; To: info@imprimaatur.ee&lt;br /&gt;
 &amp;gt; Subject: Imprimaaturis avaldatud materjalide kasutamine&lt;br /&gt;
 &amp;gt;=20&lt;br /&gt;
 &amp;gt;=20&lt;br /&gt;
 &amp;gt; hr. Tavast&lt;br /&gt;
 &amp;gt;=20&lt;br /&gt;
 &amp;gt; Kas tohiks teie ariklit aadressil&lt;br /&gt;
 &amp;gt; http://www.imprimaatur.ee/artiklid/spik9809.html&lt;br /&gt;
 &amp;gt;=20&lt;br /&gt;
 &amp;gt; Kasutada k2nnuna (stub) hv wikis (Andmeside alajaotuses)&lt;br /&gt;
 &amp;gt; http://wiki.hv.ee&lt;br /&gt;
 &amp;gt;=20&lt;br /&gt;
 &amp;gt; A.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=V%C3%B5rguseadmete_t%C3%BC%C3%BCbid_ja_liigitus&amp;diff=1980</id>
		<title>Võrguseadmete tüübid ja liigitus</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=V%C3%B5rguseadmete_t%C3%BC%C3%BCbid_ja_liigitus&amp;diff=1980"/>
		<updated>2005-10-21T11:21:51Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Kasulikud Näpunäited]]&lt;br /&gt;
[[Kategooria:Andmeside]]&lt;br /&gt;
[[Kategooria:Füüsilisekihi juhendid]]&lt;br /&gt;
&lt;br /&gt;
==Mis on hub, router, switch...==&lt;br /&gt;
&lt;br /&gt;
Võtaks ette järjekordse segase asja, kõik need kaablipuntrasse mattunud lapikud kastid kapinurgas ja muu võrgundusega seotud kraami, ja prooviks neist mingi lihtsurelikule arusaadava süsteemi moodustada. Seda ülesannet raskendab tootjate omavaheline kemplemine, mis muuhulgas väljendub sama asja nimetamises eri nimedega, ning tehnika järelejätmatu areng, mis tingib sõnade tähenduse kiire nihkumise. Kuid proovime siiski, abiks sõnastikud ja standardid.&lt;br /&gt;
Lihtsaim&lt;br /&gt;
&lt;br /&gt;
Alustame kõige lihtsamast võrgust: kaks arvutit on omavahel ühendatud kaabli abil. Laskumata üksikasjadesse selle kaabli iseloomu või teda mööda liikuvate protokollide kohta, võime öelda, et lisaks arvutitele ja kaablile läheb kummagi arvuti juures tarvis veel üht asja: võrguadapterit (network adapter, network interface card, NIC). See on tavaliselt lisaplaadina, sülearvutite jaoks sageli ka PC-kaardina realiseeritud või siis emaplaadile integreeritud seade, mis ühendab arvuti (või muu seadme, näiteks printeri) kohtvõrguga. Kasutaja jaoks on võrguadapterist näha enamasti vaid pistikud, kas siis telefonipistikut meenutav RJ-45 telefonikaablit meenutava bifilaarkaabli (twisted-pair cable) jaoks või teleri antennipistikut meenutav BNC antennikaablit meenutavale koaksiaalkaablile (coaxial cable). Muuseas, bifilaarkaabli kohta ütlevad paljud keerdpaar (twisted pair, sünonüüm bifilaar), mis on vaid veidi ebatäpne. Asi selles, et kaablis võib olla ja nt telefonikaablis enamasti ongi mitu paari. Keerdpaar tähistab rangelt võttes üht sellist paari ja bifilaarkaabel kogu kaablit koos võimalike kaitsekihtide ja muuga.&lt;br /&gt;
&lt;br /&gt;
Igal asjal on piirid, muuhulgas ka kaabli pikkusel. Kui arvutid asuvad teineteisest liiga kaugel, paneme vahele järguri ehk repiiteri (repeater), mis võimendab ja puhastab signaali enne edastamist. Järgur töötab OSI protokollistiku kõige madalamal, füüsilisel tasemel, ega tea midagi edastatavatest andmetest. Tema võimendab elektrilisi impulsse.&lt;br /&gt;
&lt;br /&gt;
Arendame võrku edasi ning&lt;br /&gt;
lisame veel ühe arvuti.&lt;br /&gt;
&lt;br /&gt;
Kõige odavam viis seda teha on asendada tavaline järgur mitmepordilise järguri ehk jaoturiga (multiport repeater, hub), mis erineb järgurist peamiselt portide arvu poolest - tal on neid 8, 16 vms.&lt;br /&gt;
&lt;br /&gt;
Jaotureid on mitmesuguseid. Lihtsaim ehk passiivne jaotur (passive hub) käitub sisuliselt harukarbina, kuid tänapäeval on rohkem levinud mitmesugused edasiarendused, kus lisatud on haldus- ja seirefunktsioone - aktiivsed jaoturid (intelligent hub, manageable hub).&lt;br /&gt;
&lt;br /&gt;
Kui anda jaoturile ka aadresside lugemise võime ning panna ta edastama saadetisi ainult vajalikele portidele, saame kommuteeriva jaoturi (switching hub).&lt;br /&gt;
&lt;br /&gt;
Token Ringi võrgus kasutatakse jaoturi kohta ka lühendit MAU (Multistation Access Unit). Etherneti võrgus tähendab MAU jälle midagi muud - Media Access Unit on seal sama mis transiiver (tranceiver) ehk see tavaliselt võrguadapteri koosseisu kuuluv lülitus, mis otseselt saadab signaale võrgukaablisse ja võtab neid sealt vastu.&lt;br /&gt;
&lt;br /&gt;
Sageli kasutatakse jaoturite kohta veel sõna kontsentraator (concentrator, shared media concentrator). See on samuti põhimõtteliselt õige, sest jaotur on üks kontsentraatori liike. Viimane sõna on tegelikult palju vanem ja tähistab kanalite koondamisega tegelevat seadet üldisemas mõttes, mh nt seadet, mis Interneti teenusepakkuja juures surub üksikud modemiliinid kiiremale rendiliinile kokku.&lt;br /&gt;
Kui võrk kasvab&lt;br /&gt;
&lt;br /&gt;
Lihtsuse huvides eeldame, et kohtvõrgu protokoll on Ethernet. See protokoll töötab liikluse ja põrke tuvastamise abil, st iga jaam üritab saata, kui tal tekib selleks vajadus ning kandja on parajasti vaba. Iga saadet kuulevad kõik teised jaamad. Kui kaks jaama saadab ühel ajal, tekib põrge (collision), mõlemad lõpetavad saatmise, ootavad juhusliku ajavahemiku ja proovivad uuesti, lootuses et teine jaam ootas teistsuguse aja.&lt;br /&gt;
&lt;br /&gt;
Nii lihtsaima kahearvutilise võrgu kui ka kontsentraatori kasutamise puhul jagavad kõik jaamad ühist edastuskeskkonda, teiste sõnadega kuuluvad samasse põrkedomeeni (collision domain) - kõigi jaamade saatekatsed võivad üksteisega põrkuda. Kui võrgu koormatus (utilization) on suurusjärgus paar-kolmkümmend protsenti või alla selle, siis töötab süsteem hästi. Koormuse kasvades hakkavad üha olulisemat osa võrguliiklusest moodustama põrked, tehes võrgu lõpuks täiesti töövõimetuks.&lt;br /&gt;
&lt;br /&gt;
Lahendus on jaotada võrk väiksemateks segmentideks (segment) ning edastada ühest segmendist teise ainult see osa liiklusest, mis tõesti on sinna adresseeritud. Kui segmendid mõistlikult koostada, püsib enamus liiklust ühe segmendi (nt osakonna või projektirühma) piires ning võrgu kõigi osade koormatus langeb korralikku funktsioneerimist võimaldavale tasemele. Segmenteerimist võimaldavad seadmed on kommutaatorid, sillad ja marsruuterid.&lt;br /&gt;
&lt;br /&gt;
Kommutaator (switch) istub kohtvõrgu keskel umbes nagu ülalvaadeldud kontsentraator, kuid edastab liiklust ainult nendele portidele, mis seda vajavad. Kommutaatori porti võib olla ühendatud kas üksainus jaam, mitmest jaamast koosnev jaoturiga segment, või teine kommutaator. Kommutaator töötab OSI mudeli teisel, lülikihil.&lt;br /&gt;
&lt;br /&gt;
Niisiis, kommutaator ühendab lahti põrkedomeenid, vähendades põrgete arvu. Kuid levisaated (broadcast) ja multisaated (multicast), vastavalt kohtvõrgu kõigile või mitmele andmejaamale adresseeritud saadetised, jõuavad ikka kogu võrguni. See pole suure võrgu puhul vältimatult hea, sest selliste saadetistega peavad siis tegelema kogu võrgu kõik jaamad. Kui niisugune liiklus hakkab üle pea kasvama, võib võrgu segmenteerida ka selles mõttes - jaotada ta eri levidomeenideks (broadcast domain). Mängu tulevad marsruuterid.&lt;br /&gt;
Marsruuter&lt;br /&gt;
&lt;br /&gt;
(router) on funktsionaalüksus, mida üldjuhul kasutatakse kohtvõrkude ühendamiseks kaugvõrgu kaudu. Kuna punktist A punkti B pääseb enamasti rohkem kui üht teed mööda, siis tegelevad marsruuterid ka parima tee valimisega, vahetades selleks omavahel marsruutimisinfot. Tee headust mõõdetakse muuhulgas hüpete ehk hoppide arvuga (hop) - see on algus- ja lõpp-punkti vahele jäävate marsruuterite arv.&lt;br /&gt;
&lt;br /&gt;
Muuseas, sõna router hääldus &amp;quot;ruuter&amp;quot; pärineb briti inglise keelest. Ameeriklased ütlevad &amp;quot;rauter&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Marsruuter võib olla realiseeritud kas riistvaras või tarkvaras. Alguses olid levinud viimased, st marsruuter oli lihtsalt ühendatavates arvutites töötav firmapärane tarkvarajupp, mis oskas ümber käia selle konkreetse süsteemi protokollidega. Seejärel said populaarseks universaalsed riistvaralised marsruuterid, kuid nüüd hakkab ajaloospiraalile jälle täisring peale saama: esiteks on protsessorid piisavalt kiired, et marsruutimisega muu töö kõrvalt hakkama saada, ja teiseks on protokollide paljusus kokku kuivanud, väga paljudele piisab IP-st ja IPX-ist.&lt;br /&gt;
&lt;br /&gt;
Marsruuterid töötavad OSI mudeli kolmandal, võrgukihil. See tähendab, et nad saavad aru kaadrites sisalduvatest pakettidest ning on võimelised neid &amp;quot;ümber pakendama&amp;quot;. Näiteks kui Token Ringi pordilt tuleb sisse IPX-pakett Token Ringi kaadris, siis marsruuter oskab selle paketi väljastada Etherneti kaadris Etherneti pordile. Pakettide endi sisu kallale marsruuterid üldjuhul ei kipu.&lt;br /&gt;
Sillad ja muud&lt;br /&gt;
&lt;br /&gt;
Kui aga on kasutusel mittemarsruuditav (non-routable) protokoll, mis tähendab, et kaadris pole antud sihtaadressi ilmutatud kujul, vaid kasutatakse jaamade kokkuleppelisi nimesid (nende kokkuleppimiseks läheb siis tarvis levisaadet), siis selle kaadritega ei oska marsruuter midagi peale hakata. Mittemarsruuditavad on näiteks SNA ja NetBEUI, mis olid algselt mõeldud kasutamiseks ühe kohtvõrgu piires. Levinud viis nende protokollide edastamiseks suuremates võrkudes on silla (bridge) kasutamine. Sild on lülikihi (OSI mudeli 2. kiht) seade, mis vaatab kaadrit kui tervikut ega tea midagi selle sisu kohta.&lt;br /&gt;
&lt;br /&gt;
Seade, mis käitub olenevalt protokollist kas silla või marsruuterina, on brauter (brouter, bridge/router).&lt;br /&gt;
&lt;br /&gt;
Marsruuteri ja kommutaatori omadused on ühendatud mitmekihilises kommutaatoris (multilayer switch). Need moodsad ja läbinisti riistvaras realiseeritud seadmed saavad hakkama väga kiire marsruutimisega. Nende modifikatsioon on vookommutaator (flow switch), mis töötab nagu tavaline tarkvaraline marsruuter võrgukihil, kuid otsib andmete hulgast &amp;quot;voogusid&amp;quot; - suurt hulka samast allikast samasse sihtkohta liikuvaid pakette. Voo leidmisel langeb seade OSI mudelis taseme võrra allapoole ning rakendab voo kestmise ajaks tööle riistvaras realiseeritud kommutaatori.&lt;br /&gt;
&lt;br /&gt;
Kui liikuda marsruuterist teisele poole, üles OSI mudelis, siis jõuame lüüsini (gateway, protocol converter). See rakenduskihi seade oskab lahti võtta ka pakette, näiteks teisendada andmeid IPX-i ja TCP/IP vahel.&lt;br /&gt;
No nii,&lt;br /&gt;
&lt;br /&gt;
saidki tähtsamad lapikud kastid üles loetud. Siintoodud ei ole siiski mingid absoluutsed definitsioonid ning teatud kontekstides võidakse neid sõnu kasutada hoopis teistes tähendustes. Näiteks mõned aastad tagasi nimetas Novell sillaks seda, mida praegu peetakse marsruuteriks. Ka TCP/IP lüüs on praeguse arusaama järgi marsruuter.&lt;br /&gt;
&lt;br /&gt;
Firmade arendusosakonnad töötavad muidugi edasi, luues omavahel võistlevaid lahendusi, andes neile kummalisi, sageli konfliktseid nimesid ja üritades neid standardiks kuulutada.&lt;br /&gt;
&lt;br /&gt;
Kasutatud kirjandus&lt;br /&gt;
&lt;br /&gt;
1. Shnier, M., Computer Dictionary, Que 1998&lt;br /&gt;
&lt;br /&gt;
2. Dictionary of Computing, Oxford University Press 1997&lt;br /&gt;
&lt;br /&gt;
3. ISO/IEC 2382-25 (Eesti standardi projekt)&lt;br /&gt;
&lt;br /&gt;
4. PC Webopedia&lt;br /&gt;
&lt;br /&gt;
Tänan Arne Ansperit ja Vello Hansonit märkuste eest.&lt;br /&gt;
&lt;br /&gt;
Kopeeritud [mailto:info@imprimaatur.ee Arvi Tavasti] [http://www.imprimaatur.ee/artiklid/spik9809.html artiklist]. &lt;br /&gt;
Autor on andnud loa antud artikli wikisse paigutamiseks täiendamiseks ja parandamiseks.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=SMB_ja_NetBIOS&amp;diff=1963</id>
		<title>SMB ja NetBIOS</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=SMB_ja_NetBIOS&amp;diff=1963"/>
		<updated>2005-10-20T19:39:14Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Aplikatsioonikihi juhendid]]&lt;br /&gt;
[[Category:Kasulikud Näpunäited]]&lt;br /&gt;
&lt;br /&gt;
==Pisike ülevaade võimalikest põhjustest, miks ühed Windowsid teisi &amp;quot;ei näe&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
NetBIOS nimed, Master Browserid ja muud loomad.&lt;br /&gt;
&lt;br /&gt;
Enne Windows2000 ja Active Directory ilmumist armastasid Windowsi masinad teineteist &amp;quot;leida&amp;quot; NetBIOSe nimede abil. Kuigi NetBIOSe nimelahendus loodi algselt just NetBEUI protokolli tarvis, on ta suuteline toimima ka teiste protokollide, näiteks TCP/IP ja IPX/SPX peal. Tegemist on suhteliselt tobeda ja mõttetu jäänukiga &amp;quot;vanadest aegadest&amp;quot; ega oma üldse seost sellega, kuidas masinad omavahel andmeid vahetavad.&lt;br /&gt;
Omavaheliseks suhtluseks kasutavad windowsi masinad mõnda madaltaseme protokolli (näiteks TCP/IP) mille peal jookseb siis teenustekihi protokoll SMB (Server message Block). NEtBEUI mille Microsoft väikeste võrkude jaoks aretas on mitterouditav ja &amp;quot;isekonfigureeruv&amp;quot; protokoll, mille üheks osaks oli seesinane NetBIOS Name Resolution. Kuidagiviisi pidid need õnnetud kastid ju teineteist &amp;quot;nägema&amp;quot;. Siis tuligi mängu tobedus nimega &amp;quot;master browser&amp;quot; koos &amp;quot;network naaberhoodi&amp;quot; ja muude rõõmudega, sest Microsofti arvates oli see sõltumatu, konfigureerimist/teenusserverit MITTEnõudev väikestele paar-võrkudele sobiv lahendus.&lt;br /&gt;
Alates W2K aegadest visati aegunud ja mõttetu NetBIOS kus see ja teine ja hakti kasutama inimlikku fqdn/DNS nimelahendust.Sinu probleem pole selles, et 98sad &amp;quot;ei näeks&amp;quot; XPsid. &amp;quot;Näevad&amp;quot; küll ja kuidas veel. Lihtsalt Network Neighbourhoodis neid ei paista kuid sisestades käsurealt \\masinanimi või \\masinaip on võimalik nimetatud agregaadiga ühendust saada. Siiamaani oleks nagu kõik ilus. Kontrollime, et meil oleks NetBIOS over TCP/IP sisse lülitatud ja juba peaksidki nimed lahenema. Paraku, tundes Microsofti OSe pisut praktikas, ei või kunagi kindel olla, kas see asi TEGELIKULT ka tööle läks. Huvitav utiliit mida käsurealt tasub käivitada, on nbtstat. Nbtstati manuali siia kirjutama ei hakka, aga kui käsk nbtstat -n annab &amp;quot;no names in name cache&amp;quot; siis NetBIOSe nimelahendus ei tööta.&lt;br /&gt;
Nüüd jõuame järgmise õuduse juure, mille nimi on Master Browser. Hästi lühidalt - Master Browser on purk, mis peab üleval võrgus istuvate masinate nimekirja, ja vajaduse korral jagab seda teistele. Miks? Muidu peaks IGA võrku lülitunud arvuti küsima kõigi teiste käest &amp;quot;kule ä, mis su nimi on&amp;quot; ja andmeside jaoks suurt ruumi nagu ei jääkski. Paraku valitakse Master Browser ebadomokraatlikel valimistel kus kangema &amp;quot;OS level&amp;quot;-iga seade võidab. St. NT võidab 9x, 2K võidab NT jne.&lt;br /&gt;
[edit: täpsustus kasutaja HPTA374 poolt]&lt;br /&gt;
mis puutub master brauserisse siis NT puhul teeb seda primari domeen kontra ja w2k puhul samuti, juhul kui w2k on standalone on kõveim tegija NT&lt;br /&gt;
[/edit]&lt;br /&gt;
Ühesõnaga Smith and Wesson tapab 4 ässa Kõik oleks ilus, aga paraku ei pruugi w95/98 ARU saada, et nad valimised kaotasid (Suurepärane Microsofti backward compatibility, you know) ja nii tekib võrku sisuliselt kaks Master Browserit - Suurte Poiste (Xp,2K) ja salabonide (9x) oma ja network naaberhuud näeb välja täpselt nii nagu tema parasjagu näeb.&lt;br /&gt;
/../&lt;br /&gt;
In a small mixed OS network, you may want disable W2K/XP master browser and keep w9x or NT master browser&lt;br /&gt;
&lt;br /&gt;
In a small mixed OS workgroup network, you may want to disable W2K/XP master browser and keep w9x or NT master browser because XP/W2K always win elections over others, and other previous OS doesn't understand it. To disable master browser on W2K/XP, go to Administrative Tools&amp;gt;Services, stop the Computer Browser.&lt;br /&gt;
/../&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.chicagotech.net/browser.htm Master Browseri probleemid]&lt;br /&gt;
&lt;br /&gt;
[http://www.chicagotech.net/netbios&amp;amp;wins.htm NetBIOS Name resolutioni probleemid]&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=GPRS_seadistamine&amp;diff=1962</id>
		<title>GPRS seadistamine</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=GPRS_seadistamine&amp;diff=1962"/>
		<updated>2005-10-20T19:28:12Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Kasulikud Näpunäited]]&lt;br /&gt;
[[Kategooria:Andmeside]]&lt;br /&gt;
[[Kategooria:Võrgukihi juhendid]]&lt;br /&gt;
&lt;br /&gt;
==GPRS Seadistamine==&lt;br /&gt;
&lt;br /&gt;
GPRS telefon, olenemata sellest, kuidas see arvutava seadmega ühendub(kas mõne kaabli, irda või suisa sinise hamba abil), käitub üsna tavalise modemina.&lt;br /&gt;
&lt;br /&gt;
Enne sessiooni alustamist on mõistlik igat modemit resettida: ATZ. Tavaliselt teeb OS'i helistamisvahend selle ise meie eest ära.&lt;br /&gt;
Edasi, enne ühenduse saamist on vajalik paika sättida AP (Access Point) nimi. Mõned armastavad seda seadistada telefonist endast (kas siis käsitsi või küsides operaatori käest seadistused), kuid mulle meeldib APN alati init stringiga arvutavast seadmest saata:&lt;br /&gt;
EMT puhul AT+CGDCONT=1,&amp;quot;IP&amp;quot;,&amp;quot;internet.emt.ee&amp;quot;,&amp;quot;&amp;quot;,0,0&lt;br /&gt;
RLE Puhul: AT+CGDCONT=1,&amp;quot;IP&amp;quot;,&amp;quot;internet&amp;quot;,&amp;quot;&amp;quot;,0,0&lt;br /&gt;
Microsofti OS'ide puhul kirjutatakse siis modemi seadistuste Advanced aknasse: +CGDCONT=1,&amp;quot;IP&amp;quot;,&amp;quot;internet.emt.ee&amp;quot;,&amp;quot;&amp;quot;,0,0 või +CGDCONT=1,&amp;quot;IP&amp;quot;,&amp;quot;internet&amp;quot;,&amp;quot;&amp;quot;,0,0 (AT topib pisipehme sinna omatarkusest).&lt;br /&gt;
([http://pood.elion.ee/epood.asp?u=985&amp;amp;uu=5212&amp;amp;arh=&amp;amp;special=&amp;amp;lang=est&amp;amp;Smenyy=1373 Elioni] andmetel peaks stringi lõpp peaks olema siiski &amp;quot;,,0,0, mitte &amp;quot;&amp;quot;,0,0)&lt;br /&gt;
Reeglina pakutakse neljandat parameetrit ilma jutumärkideta, kuid mulle tundub jutumärkidega on korrektsem. Samas, kuna ainult esimesed kolm parameetrit on kohustuslikud, võib vabalt kasutada ka AT+[[CGDCONT]]=1,&amp;quot;IP&amp;quot;,&amp;quot;internet.emt.ee&amp;quot;. &lt;br /&gt;
Sellisel juhul sätitakse APN meie sessiooni ajaks alati selliseks nagu meile meeldib, olenemata sellest, mis telefonis eneses kirjas on.&lt;br /&gt;
&lt;br /&gt;
Muide, olles EMT kliendina välismaal (noh umbes nagu dokumentideta võõras linnas), on kaval meeles pidada, et APN &amp;quot;internet&amp;quot; on mingil kombel kirjutamata standard ning enamik operaatoreid ei pahanda kui võõrriigi GPRSikasutaja kasutab kohaliku operaatori APN'i (internet, mitte internet.emt.ee). Selliselt õnnestub kokku hoida EMT poolne GPRSi tasu ning maksta ainult kohaliku operaatori tasu (mida tuleks maksta nii ehk naa).&lt;br /&gt;
&lt;br /&gt;
Jääb üle valida number...&lt;br /&gt;
Nokia puhul: *99#&lt;br /&gt;
Ericssoni puhul: *98*1#&lt;br /&gt;
Siemensi puhul: *99***1#&lt;br /&gt;
Samsungi puhul: *99***1#&lt;br /&gt;
&lt;br /&gt;
Ongi kõik.. Telefon käivitab PPP(eesti operaatorid ning enamik välismaiseid authenti ei taha, kuid ega midagi halba ei juhtu kui kasutajanime ja parooli kohale veidi roppusi kirjutada) ning kui võrgus on vaba ressurssi, saabki bitikesi liigutada...&lt;br /&gt;
&lt;br /&gt;
Kusjuures... tasub meeles pidada, et arvutava seadmega räägib PPP'd telefon, mitte operaator (mida telefon ja keskjaam omavahel räägivad, on nii põrgulikult keeruline, et jumalapäike jõuab enne mitu korda looja minna kui selle teemaga ühele poole saab), mistõttu võib erinevate seadmete kokkusobimine erinevate telefonidega sõltuda telefonis jooksvast softist. See on, muide, ka põhjuseks miks igasugu vahvad PPP kompressioonid GPRSi korral erilist mõtet ei oma - mis mõte on kompressida liiklust telefoni ja arvutava seadme vahel kui GSM võrgus liiguvad asjad ikka nii nagu liiguvad.&lt;br /&gt;
Kokkusobivusprobleem, mille otsa ma ise olen komistanud, oli eeriku 520m telefoni ning linuxiga, lahenduseks tuli ppp_async moodulile anda parameetriks flag_time=0...&lt;br /&gt;
Usutavasti käituvad tänapäevased telefonid inimlikumalt.&lt;br /&gt;
&lt;br /&gt;
==GDCONT parameeter==&lt;br /&gt;
 &lt;br /&gt;
Üldiselt on sedasi, et GPRS telefonide puhul, kõik, mis järgneb AT+ käsule, on GPRS modemi seadistused. Neid käske, mida tegelikult anda saab, on rohkem kui CGDCONT aga ärme hakkame asja keeruliseks ajama vaid uurime, mida need CGDCONT'i parameetrid seal siis tähendavad:&lt;br /&gt;
&lt;br /&gt;
CGDCONT ise on tegelikult veidi võimekam käsk kui lihtsalt APN'i määramine, kuid üldiselt teda selleks kasutatakse niiet mõistame teda hetkel nõnda.&lt;br /&gt;
1) CID, ehk siis seadistuste ID(telefonis saab olla rohkem kui üks data seadistus). See parameeter on numbriline, seetõttu seal ümber jutumärke ei ole.&lt;br /&gt;
2) PDP_Type, ehk siis protokoll, mida me üritame rääkida.. Tavaliselt on selleks IP, kuid näiteks minu telefon oskaks ka IPv6 protokolli (kui operaator suvatseks) ning mõned seadmed oskavad ka PPP'd (ilmselt on see siis selline PPP, mida räägitakse üle GPRS kanali otse operaatori vastava seadmega, mitte tavaline arvuti ja telefoni vaheline PPP). See parameeter on string, mistõttu on ta alati jutumärkide sees.&lt;br /&gt;
3) APN, ehk siis konkreetse ligipääsupunkti nimi. Loomulikult string, seetõttu jutumärkides.&lt;br /&gt;
4) PDP_Addr, mis peaks olema siis ligipääsupunkti aadress. Tavaliselt pakub operaator selle aadressi ise, mistõttu seda ei määrata. Kuna see on tegelikult string, siis peaks see olema jutumärkide sees, kuid arvatavasti lepitakse olematu parameetri puhul ka ilma. Vähemalt Nokia, Siemensi ning Ericssoni telefonid ei nurise kui see parameeter ka üldse puudub.&lt;br /&gt;
5) Data Compression, numbriline parameeter, mis saab olla kas 0 või 1. 0 puhul data kompressiooni ei kasutata, 1 puhul datat kompressitakse.&lt;br /&gt;
6) Header Compression, numbriline parameeter, saab samuti olla 0 või ning käib analoogselt eelmisega headerite pakkimiseks.&lt;br /&gt;
Need kompressioonid käivad siis juba mitte arvuti ja telefoni vahelise jutuvada kohta vaid GSM võrgus liikuvate andmete pihta.&lt;br /&gt;
Minu telefon kumbagi kompressiooni ei oska, mistõttu on mul raske proovida, kas meie armastusväärne mobiilioperaator oskaks.&lt;br /&gt;
&lt;br /&gt;
Veidi infot on võimalik saada kui minna oma telefonile mõne terminaliemulaatoriga kallale ning anda järgmisi käske:&lt;br /&gt;
AT+CGDCONT=? kuvab võimalike protokollide ja seadistuste loetelu&lt;br /&gt;
AT+CGDCONT? kuvab defineeritud CID'd&lt;br /&gt;
&lt;br /&gt;
Tjah... kes viitsib rohkem uurida, mida kõike ühe GRPS modemiga teha saab, siis mingil määral abiks dokument vedeleb näiteks sellel aadressil:&lt;br /&gt;
http://www.rfsolutions.co.uk/acatalog/Downloads/AT_CMD_GPRS.pdf&lt;br /&gt;
&lt;br /&gt;
Autor: [http://foorum.hinnavaatlus.ee/profile.php?mode=viewprofile&amp;amp;u=20974 wookie]&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=V%C3%B5rguteenused_Windowsis_ei_toimi&amp;diff=1689</id>
		<title>Võrguteenused Windowsis ei toimi</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=V%C3%B5rguteenused_Windowsis_ei_toimi&amp;diff=1689"/>
		<updated>2005-10-17T06:54:37Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Aplikatsioonikihi juhendid]]&lt;br /&gt;
Mida kontrollida kui ühest Windowsi arvutist ei õnnestu kasutada teise Windowsi arvuti jagatud ressurssi:&lt;br /&gt;
&lt;br /&gt;
Lihtsuse mõttes nimetame jagavat arvutit edaspidi &amp;quot;server&amp;quot; ja ressurssi kasutavat arvutit &amp;quot;klient&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Kontrolli:&lt;br /&gt;
&lt;br /&gt;
# Kas sul on serverile installitud &amp;quot;File and Print sharing for Microsoft Networks&amp;quot;?&lt;br /&gt;
# Kas sul on kliendile installitud &amp;quot;Client for Microsoft Networks&amp;quot;?&lt;br /&gt;
## Kui kliendile/serverile on paigaldatud rohkem kui üks protokoll, siis kontrolli, et MS Networkingu teenus ja klient on &amp;quot;binditud&amp;quot; sama protokolli külge. Enamikel juhtudel ei ole tarvis rohkem kui TCP/IP protokolli ja &amp;quot;bindingu&amp;quot; teeb Windows automaatselt.&lt;br /&gt;
# Kas ressurss (ketas/kataloog/printer) serveris on &amp;quot;sharetud&amp;quot;?&lt;br /&gt;
# Kas serveris on olemas kasutaja kellele on lubatud antud õigused &amp;quot;sharele&amp;quot;. (Paremklõps jagatud ressursil, properties, security (NT/2K/XP))*&lt;br /&gt;
# Kas serveri tulemüür lubab sissetulevaid smb ühendusi (MS Networking)_&lt;br /&gt;
# Kas sa oled klienti sisse logitud selle kasutajaga, kellel on serveris vastavad õigused?&lt;br /&gt;
# Kontrolli, et sa *EI* oleks emba-kumba (serverit v. klienti) vastava registry-muudatusega sundinud kasutama krüptimata (plaintext) paroole. Kui yks pool eeldab krüptitud parooli ja teine pakub &amp;quot;plaintexti&amp;quot; siis autentimine ei pruugi õnnestuda!&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui eelnevatele punktidele on vastus &amp;quot;JAH&amp;quot; siis tee kliendist:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Start-&amp;gt;Run \\sinuserverinimi\ [ENTER]&lt;br /&gt;
&lt;br /&gt;
Või kui see ei peaks mingil põhjusel toimima, siis&lt;br /&gt;
&lt;br /&gt;
Start-&amp;gt;Run \\sinu.server.ip\ [ENTER]&lt;br /&gt;
&lt;br /&gt;
Peaks viskama lahti sinu PC sharede nimekirja.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Lisamaterjali punkt 4. juurde.&lt;br /&gt;
Situatsioon: WinXP/2K on &amp;quot;server&amp;quot; Win9x on &amp;quot;klient&amp;quot;. Seadistamine:&lt;br /&gt;
&lt;br /&gt;
Metasüntaks: Menüüvalik v. sisestus, &amp;quot;Tab&amp;quot;, [Nupp], Radio Button (o), Checkbox [ ], Checkbox checked [v]&lt;br /&gt;
&lt;br /&gt;
'''Windows XP''':&amp;lt;br/&amp;gt;&lt;br /&gt;
Start -&amp;gt; Settings -&amp;gt; Control Panel -&amp;gt; Computer Management -&amp;gt; Local Users and Groups -&amp;gt; Users -&amp;gt; New User&lt;br /&gt;
Saad teha uue kasutaja. Oletame, et me teeme kasutaja nimega &amp;quot;kasutaja&amp;quot; ja parooliga &amp;quot;kasutaja&amp;quot;&lt;br /&gt;
Nüüd :&lt;br /&gt;
My Computer -&amp;gt; Tools -&amp;gt; Folder Options -&amp;gt; View&lt;br /&gt;
Kruvime selle puu lõpuni alla ja EEMALDAME linnukese valiku &amp;quot;[ ] Use simple file sharing&amp;quot; eest&lt;br /&gt;
Edasi otsime üles kataloogi mida soovime jagada, paremklõps:&lt;br /&gt;
Properties-&amp;gt;&amp;quot;Sharing&amp;quot;-&amp;gt;Share this folder(o) -&amp;gt; [Apply]&lt;br /&gt;
&amp;quot;Security&amp;quot;-&amp;gt;[Add]-&amp;gt;kasutaja-&amp;gt;[OK]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selle tegevuse järel on kasutajal &amp;quot;kasutaja&amp;quot; sellele sharele lugemisõigused:&lt;br /&gt;
&lt;br /&gt;
'''Win 98'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Start-&amp;gt;Settings-&amp;gt;Control Panel-&amp;gt;Network -&amp;gt;Primary Network Logon &amp;quot;Microsoft Network&amp;quot; -&amp;gt; [OK] restart&lt;br /&gt;
Logid sisse kasutaja, kasutaja&lt;br /&gt;
Start-&amp;gt;run-&amp;gt; \\sinuXP-IPaadress\sinutehtudsharenimi [OK]&lt;br /&gt;
&lt;br /&gt;
Autor: [http://foorum.hinnavaatlus.ee/profile.php?mode=viewprofile&amp;amp;u=13761 OFFF]&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=V%C3%B5rguteenused_Windowsis_ei_toimi&amp;diff=1688</id>
		<title>Võrguteenused Windowsis ei toimi</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=V%C3%B5rguteenused_Windowsis_ei_toimi&amp;diff=1688"/>
		<updated>2005-10-17T06:44:35Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kasulikud Näpunäited]]&lt;br /&gt;
[[Category: Aplikatsioonikihi juhendid]]&lt;br /&gt;
Mida kontrollida kui ühest Windowsi arvutist ei õnnestu kasutada teise Windowsi arvuti jagatud ressurssi:&lt;br /&gt;
&lt;br /&gt;
Lihtsuse mõttes nimetame jagavat arvutit edaspidi &amp;quot;server&amp;quot; ja ressurssi kasutavat arvutit &amp;quot;klient&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Kontrolli:&lt;br /&gt;
&lt;br /&gt;
# Kas sul on serverile installitud &amp;quot;File and Print sharing for Microsoft Networks&amp;quot;?&lt;br /&gt;
# Kas sul on kliendile installitud &amp;quot;Client for Microsoft Networks&amp;quot;?&lt;br /&gt;
## Kui kliendile/serverile on paigaldatud rohkem kui üks protokoll, siis kontrolli, et MS Networkingu teenus ja klient on &amp;quot;binditud&amp;quot; sama protokolli külge. Enamikel juhtudel ei ole tarvis rohkem kui TCP/IP protokolli ja &amp;quot;bindingu&amp;quot; teeb Windows automaatselt.&lt;br /&gt;
# Kas ressurss (ketas/kataloog/printer) serveris on &amp;quot;sharetud&amp;quot;?&lt;br /&gt;
# Kas serveris on olemas kasutaja kellele on lubatud antud õigused &amp;quot;sharele&amp;quot;. (Paremklõps jagatud ressursil, properties, security (NT/2K/XP))*&lt;br /&gt;
# Kas serveri tulemüür lubab sissetulevaid smb ühendusi (MS Networking)_&lt;br /&gt;
# Kas sa oled klienti sisse logitud selle kasutajaga, kellel on serveris vastavad õigused?&lt;br /&gt;
# Kontrolli, et sa *EI* oleks emba-kumba (serverit v. klienti) vastava registry-muudatusega sundinud kasutama krüptimata (plaintext) paroole. Kui yks pool eeldab krüptitud parooli ja teine pakub &amp;quot;plaintexti&amp;quot; siis autentimine ei pruugi õnnestuda!&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui eelnevatele punktidele on vastus &amp;quot;JAH&amp;quot; siis tee kliendist:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Start-&amp;gt;Run \\sinuserverinimi\ [ENTER]&lt;br /&gt;
&lt;br /&gt;
Või kui see ei peaks mingil põhjusel toimima, siis&lt;br /&gt;
&lt;br /&gt;
Start-&amp;gt;Run \\sinu.server.ip\ [ENTER]&lt;br /&gt;
&lt;br /&gt;
Peaks viskama lahti sinu PC sharede nimekirja.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Lisamaterjali punkt 4. juurde.&lt;br /&gt;
Situatsioon: WinXP/2K on &amp;quot;server&amp;quot; Win9x on &amp;quot;klient&amp;quot;. Seadistamine:&lt;br /&gt;
&lt;br /&gt;
Metasüntaks: Menüüvalik v. sisestus, &amp;quot;Tab&amp;quot;, [Nupp], Radio Button (o), Checkbox [ ], Checkbox checked [v]&lt;br /&gt;
&lt;br /&gt;
'''Windows XP''':&amp;lt;br/&amp;gt;&lt;br /&gt;
Start -&amp;gt; Settings -&amp;gt; Control Panel -&amp;gt; Computer Management -&amp;gt; Local Users and Groups -&amp;gt; Users -&amp;gt; New User&lt;br /&gt;
Saad teha uue kasutaja. Oletame, et me teeme kasutaja nimega &amp;quot;kasutaja&amp;quot; ja parooliga &amp;quot;kasutaja&amp;quot;&lt;br /&gt;
Nüüd :&lt;br /&gt;
My Computer -&amp;gt; Tools -&amp;gt; Folder Options -&amp;gt; View&lt;br /&gt;
Kruvime selle puu lõpuni alla ja EEMALDAME linnukese valiku &amp;quot;[ ] Use simple file sharing&amp;quot; eest&lt;br /&gt;
Edasi otsime üles kataloogi mida soovime jagada, paremklõps:&lt;br /&gt;
Properties-&amp;gt;&amp;quot;Sharing&amp;quot;-&amp;gt;Share this folder(o) -&amp;gt; [Apply]&lt;br /&gt;
&amp;quot;Security&amp;quot;-&amp;gt;[Add]-&amp;gt;kasutaja-&amp;gt;[OK]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selle tegevuse järel on kasutajal &amp;quot;kasutaja&amp;quot; sellele sharele lugemisõigused:&lt;br /&gt;
&lt;br /&gt;
'''Win 98'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Start-&amp;gt;Settings-&amp;gt;Control Panel-&amp;gt;Network -&amp;gt;Primary Network Logon &amp;quot;Microsoft Network&amp;quot; -&amp;gt; [OK] restart&lt;br /&gt;
Logid sisse kasutaja, kasutaja&lt;br /&gt;
Start-&amp;gt;run-&amp;gt; \\sinuXP-IPaadress\sinutehtudsharenimi [OK]&lt;br /&gt;
&lt;br /&gt;
Autor: [http://foorum.hinnavaatlus.ee/profile.php?mode=viewprofile&amp;amp;u=13761 OFFF]&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Kategooria:Aplikatsioonikihi_juhendid&amp;diff=1687</id>
		<title>Kategooria:Aplikatsioonikihi juhendid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Kategooria:Aplikatsioonikihi_juhendid&amp;diff=1687"/>
		<updated>2005-10-17T06:42:09Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Andmeside]]&lt;br /&gt;
Aplikatsioonikiht -- jutud, mis kirjeldavad, kuidas ühte või teist programmi, teenust, või teenusekihi protokolli midagi tegema panna. '''NB! EELDUS: nende juhendite lugejal on võrk, kui niisugune korras ja töötab.''' Ehk siis jutud programmidest, mis võrguvahendeid kasutavad.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
	<entry>
		<id>http://wiki.hinnavaatlus.ee/index.php?title=Kategooria:Aplikatsioonikihi_juhendid&amp;diff=1686</id>
		<title>Kategooria:Aplikatsioonikihi juhendid</title>
		<link rel="alternate" type="text/html" href="http://wiki.hinnavaatlus.ee/index.php?title=Kategooria:Aplikatsioonikihi_juhendid&amp;diff=1686"/>
		<updated>2005-10-17T06:40:16Z</updated>

		<summary type="html">&lt;p&gt;Offf: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Aplikatsioonikiht -- jutud, mis kirjeldavad, kuidas ühte või teist programmi, teenust, või teenusekihi protokolli midagi tegema panna. '''NB! EELDUS: nende juhendite lugejal on võrk, kui niisugune korras ja töötab.''' Ehk siis jutud programmidest, mis võrguvahendeid kasutavad.&lt;/div&gt;</summary>
		<author><name>Offf</name></author>
	</entry>
</feed>