17.09.2013 Views

MS-DOS Batch Files .. - Ruudoleo.com

MS-DOS Batch Files .. - Ruudoleo.com

MS-DOS Batch Files .. - Ruudoleo.com

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>MS</strong>-<strong>DOS</strong> <strong>Batch</strong> <strong>Files</strong> ..<br />

een algemene inleiding<br />

Wat zijn batch bestanden? Een batch bestand is een tekstbestand dat een set van <strong>com</strong>mando’s<br />

bevat betreffende het OS van de <strong>com</strong>puter. Dit wil zeggen dat je in een batchprogramma alle<br />

<strong>com</strong>mando’s - die je normaliter kunt uitvoeren vanop de <strong>com</strong>mand prompt – kunt integreren.<br />

Het is dus een heel eenvoudig <strong>com</strong>puterprogramma. Het wordt een batch bestand genoemd<br />

omdat het in 1 bestand een set van <strong>com</strong>mando’s batched (bundelt) die anders interactief 1 per<br />

1 van op het keyboard zouden moeten ingegeven worden. Deze (mini) programma’s worden<br />

hoofdzakelijk gebruikt ter vervanging van een set van instructies die de gebruiker veel nodig<br />

heeft. <strong>Batch</strong>bestanden bevatten geen ge<strong>com</strong>pileerde code, dus je kunt het bestand gewoon<br />

openen, kopiëren en editeren.<br />

De extensie van een batchbestand is .BAT en kan ‘gerund’ worden vanop de <strong>com</strong>mand prompt<br />

door de naam van het bestand in te tikken.<br />

<strong>MS</strong>-<strong>DOS</strong> gaat altijd als volgt te werk:<br />

Vb. een batch bestand genaamd ‘arctic.bat’. Na het intikken van arctic (enter) zal <strong>MS</strong>-<strong>DOS</strong><br />

eerst gaan kijken of we te maken hebben met een intern <strong>com</strong>mando, komt zo’n <strong>com</strong>mando niet<br />

voor dan zal <strong>MS</strong>-<strong>DOS</strong> op zoek gaan naar een bestand met als extensie (<strong>com</strong>, exe). Vindt het<br />

OS dit ook niet, dan zal het op zoek gaan naar arctic.BAT en het uitvoeren.<br />

Vb van een batch bestand..<br />

Pagina<br />

21


Je hebt gelezen dat je alle <strong>com</strong>mando’s, die je normalerwijze op de <strong>com</strong>mand prompt kunt<br />

uitvoeren, zonder moeite kunt opnemen in een batchbestand. Dit is natuurlijk niet alles, er zijn<br />

ook een aantal gereserveerde <strong>com</strong>mando’s bedoeld voor batchverwerking die we in de<br />

volgende paragrafen zullen bespreken.<br />

Echo<br />

Schakelt de weergave van de instructies in of uit of toont een bericht op het scherm.<br />

Syntax: echo [on|off] [bericht]<br />

- on|off : geeft op of de opdrachten al dan niet moeten worden weergegeven. Tik de<br />

opdracht echo zonder parameters als u de huidige instelling van deze opdracht wilt<br />

weten.<br />

- bericht : de tekst die u wilt weergeven op het scherm. Hoofdzakelijk te gebruiken<br />

wanneer echo off staat.<br />

Speciaal:<br />

Echo. : een blanko regel<br />

@ : bericht niet weergeven (geldt enkel voor de regel waar het @-teken gespecificeerd is.)<br />

Vb.<br />

Een batchbestand kort.bat bevat de volgende inhoud:<br />

cls<br />

@ echo off<br />

echo.<br />

echo.<br />

echo hieronder volgt een directory-listing<br />

echo *************************************<br />

echo.<br />

dir<br />

echo.<br />

echo dit is de tweede regel<br />

echo.<br />

echo.<br />

echo.<br />

echo laatste regel<br />

Pagina<br />

22


dit is de uitvoer:<br />

Bespreking van het voorbeeld:<br />

In de eerste regel wordt alle visualisatie van <strong>com</strong>mando’s afgezet door ‘echo off’. Dit<br />

<strong>com</strong>mando wordt echter ook niet op het scherm getoond doordat er een @ aan vooraf gaat.<br />

Cls wordt echter wel getoond maar dit gaat zo snel dat het niet met het blote oog vast te stellen<br />

is. Tik eens het batchbestand over en vervang echo off door echo on. Zie het verschil !!<br />

Pause<br />

Onderbreekt de uitvoering van een batchprogramma en geeft een bericht weer waarin staat dat<br />

het programma kan worden voortgezet door op een toets te drukken.<br />

Rem<br />

Syntax: pause<br />

Met deze opdracht kan je <strong>com</strong>mentaar (opmerkingen) opnemen in een batchbestand of in<br />

configuratiebestanden.<br />

Syntax: rem [opmerking]<br />

Pagina<br />

23


Call<br />

Roept vanuit een batchprogramma een ander batchprogramma aan zonder dat het<br />

batchprogramma wordt afgesloten. Wanneer het aangeroepen batchbestand ten einde is, wordt<br />

teruggekeerd naar het originele batchbestand dat verder verwerkt wordt.<br />

Syntax : call [station:][pad]bestandsnaam<br />

[batchparameters]<br />

Dit gaat als volgt in zijn werk..<br />

Stel: we hebben 2 batchbestanden. Op de <strong>com</strong>mand prompt tikt men Spanje<br />

De verwerking gebeurt als volgt:<br />

Allereerst wordt <strong>com</strong>mando 1 en <strong>com</strong>mando 2 uitgevoerd.<br />

Eens dit afgelopen is, wordt het bestand Madrid.BAT opgeroepen. Comm. A,<br />

Comm. B en Comm. C worden achtereenvolgens uitgevoerd. Als dit gebeurd is,<br />

keert het programma terug naar Spanje.bat en herneemt de verwerking van de<br />

<strong>com</strong>mando’s waar het gebleven was. Dus <strong>com</strong>mando 3 wordt uitgevoerd.<br />

Pagina<br />

24


Vb.<br />

Uitvoer is:<br />

AANROEP.BAT TWEEDE.BAT<br />

@echo off<br />

echo dit is aanroep.bat<br />

echo.<br />

call tweede.bat<br />

echo.<br />

echo dit is het einde<br />

echo van aanroep.bat<br />

@echo off<br />

echo.<br />

echo.<br />

echo *********************<br />

echo * dit is tweede.bat *<br />

echo *********************<br />

echo.<br />

Speciaal:<br />

Je kan een batchbestand aanmaken dat zichzelf aanroept (recursief). Zorg er wel voor dat je<br />

over een afsluitopdracht beschikt, want anders zal het programmaatje vastzitten in een ‘endless<br />

loop’.<br />

Pagina<br />

25


If…<br />

Voert een voorwaardelijke verwerking in batchprogramma’s uit. Als aan de opgegeven<br />

voorwaarde in een if-opdracht wordt voldaan, wordt de opdracht volgend op de voorwaarde<br />

uitgevoerd. Als niet aan de voorwaarde wordt voldaan, wordt de opdracht in de if-<strong>com</strong>ponent<br />

niet uitgevoerd.<br />

Syntax: if [not] errorlevel nummer opdracht<br />

if [not] tekenreeks1==tekenreeks2 opdracht<br />

if [not] exist bestandsnaam opdracht<br />

- not : Geeft aan dat de opdracht alleen moet worden uitgevoerd als niet aan de<br />

voorwaarde wordt voldaan.<br />

- errorlevel nummer : zie Choice verder in de cursus..<br />

- opdracht : de opdracht die moet worden uitgevoerd als aan de voorwaarde is<br />

voldaan.<br />

- tekenreeks1==tekenreeks2 : Geeft aan dat alleen aan de voorwaarde is voldaan<br />

als tekenreeks1 en tekenreeks2 hetzelfde zijn. Deze waarden kunnen bestaan uit<br />

letterlijke tekenreeksen of batchvariabelen. Letterlijke tekenreeksen hoeft u niet<br />

tussen aanhalingstekens te zetten.<br />

- exist bestandsnaam : Geeft aan dat aan de voorwaarde is voldaan als<br />

bestandsnaam bestaat.<br />

Enkele voorbeelden..<br />

1. Het bericht ‘Niet Gevonden’ moet op het scherm gezet worden indien het bestand<br />

‘liese.doc’ in de huidige directory niet gevonden wordt.<br />

If not exist liese.doc echo Niet Gevonden<br />

2. Als het bestand liese.doc wensen we het bestand kopie.bat aan te roepen om een<br />

backup te maken van het bestand.<br />

If exist liese.doc call kopie.bat<br />

Pagina<br />

26


Goto<br />

De opdracht goto in een batchprogramma stuurt <strong>MS</strong>-<strong>DOS</strong> naar de regel die je met een label<br />

hebt aangegeven. De opdrachten die na de opgegeven regel staan, worden vervolgens<br />

uitgevoerd door <strong>MS</strong>-<strong>DOS</strong>.<br />

Werkwijze:<br />

Syntax : goto label<br />

- label : de regel in een batchprogramma waarnaar <strong>MS</strong>-<strong>DOS</strong> moet gaan.<br />

De verwerking gebeurt als volgt:<br />

De voorwaarde wordt getest:<br />

1. als aan de voorwaarde voldaan is:<br />

dan wordt <strong>com</strong>mando A en <strong>com</strong>mando B overgeslagen en onmiddellijk<br />

naar label overgegaan voor verdere verwerking. M.a.w. enkel <strong>com</strong>m. 1 en<br />

<strong>com</strong>m. 2 worden uitgevoerd.<br />

2. als er niet aan de voorwaarde voldaan is:<br />

dan worden <strong>com</strong>mando A en <strong>com</strong>mando B uitgevoerd.<br />

Pagina<br />

27


Enkele voorbeelden..<br />

Waarom nu die goto end ?<br />

Indien deze hier niet zou opgenomen zijn, dan zou het programma (indien niet<br />

aan de voorwaarde voldaan is) gewoon alle <strong>com</strong>mando’s aflopen (regels die<br />

beginnen met ‘:’ worden genegeerd). Zowel <strong>com</strong>mando A en <strong>com</strong>mando B als<br />

<strong>com</strong>m. 1 en <strong>com</strong>m. 2 worden uitgevoerd.En dit is natuurlijk niet de bedoeling!<br />

Daarom ‘springen’ we met goto end over de subroutine. Op die manier zorgen<br />

we ervoor dat enkel <strong>com</strong>m. 1 en <strong>com</strong>m. 2 worden uitgevoerd wanneer aan de<br />

voorwaarde voldaan is en anderzijds <strong>com</strong>mando A en <strong>com</strong>mando B wanneer<br />

niet aan de voorwaarde voldaan is.<br />

1. testen of een bepaalde directory bestaat<br />

if exist d:\dostest goto verwerk<br />

…<br />

:verwerk<br />

echo de directory bestaat!<br />

Opmerkingen:<br />

1. label mag geen scheidingstekens bevatten, zoals spatie’s, puntkomma’s of ‘=’ tekens<br />

2. goto kijkt enkel naar de eerste acht tekens van het label<br />

3. VERGEET HET DUBBELE PUNT NIET !!<br />

Pagina<br />

28


Choice<br />

Wordt gebruikt om invoer van de gebruiker te vragen. Errorlevel-resultaten worden aan het<br />

batchbestand ter verwerking doorgegeven.<br />

Errorlevel<br />

Syntax: choice [/c[:]keuzes][/n][/s][/t[:]c,nn]<br />

[tekst]<br />

- /c[:]keuzes : toegelaten keuzes. Standaard J/N, Y/N<br />

- /n : verbergt de keuzes en ‘?’ op het einde van de string<br />

- /s : case-sensitive<br />

- /t[:]c,nn : indien de gebruiker na ‘nn’ seconden geen keuze gemaakt heeft, wordt<br />

de keuze ‘c’ als standaard genomen.<br />

- tekst: de tekst die je wilt visualiseren<br />

Je kunt meerdere toetsen/keuzes opgeven (zie onderstaand voorbeeld). Aan iedere toets/keuze<br />

hangt een waarde. De eerste toets/keuze krijgt het nummer 1 toegewezen, de tweede<br />

toets/keuze de waarde 2, enz…<br />

Vb. choice /c:jnd<br />

Er zijn hier 3 keuzes opgegeven ( j, n en d). Aan j wordt de waarde 1 toegekend, n=2 en<br />

d=3.<br />

In het batchbestand wordt de keuze gekoppeld aan een errorlevel . Deze moet je in<br />

aflopende volgorde weergeven.<br />

Enkele voorbeelden met hun desbetreffende uitvoer.<br />

Choice /c:jnd<br />

Choice /c:jnd Maak uw keuze<br />

Choice /c:jnd /n Ja, Nee of Doorgaan?<br />

[J, N, D]?<br />

Maak uw keuze [J, N, D]?<br />

Ja, Nee of Doorgaan?<br />

Pagina<br />

29


Uitgebreid voorbeeld:<br />

@echo off<br />

rem -..choices in life..-<br />

:begin<br />

cls<br />

echo Maak uw keuze<br />

echo -------------<br />

echo.<br />

echo A ledig de Windows Temp directory<br />

echo B geef een directory listing van C-root<br />

echo C wis het scherm<br />

echo D sluit menu<br />

echo.<br />

choice /c:ABCD /n Maak uw keuze [D] : /t:D,10<br />

if errorlevel 4 goto sluit<br />

if errorlevel 3 goto wis<br />

if errorlevel 2 goto listing<br />

if errorlevel 1 goto temp<br />

:temp<br />

del c:\windows\temp\*.*<br />

goto begin<br />

:listing<br />

dir c:\<br />

pause<br />

goto begin<br />

:wis<br />

cls<br />

goto begin<br />

:sluit<br />

Dit programma zet een menu op het scherm, naargelang de keuze worden de desbetreffende<br />

instructies uitgevoerd EN teruggekeerd naar het menu. Indien men binnen de 10 seconden<br />

geen keuze ingeeft wordt de menu afgesloten.<br />

Door gebruik van goto begin wordt een lus gesimuleerd.<br />

Pagina<br />

30


<strong>Batch</strong>parameters<br />

Er bestaan 4 soorten van parameters in batchbestanden: ‘<strong>com</strong>mand line’ parameters,<br />

omgevingsparameters, ERRORLEVELs and FOR parameters. Allen zijn van het type ‘string’<br />

met uitzondering van ERRORLEVEL, die van het type ‘byte’ is.<br />

In deze paragraaf bespreken we enkel <strong>com</strong>mand line parameters.<br />

Command line argumenten zijn de strings die na de programmanaam in de prompt<br />

ingegeven worden. In batchbestanden worden die geadresseerd door %, gevolgd door hun<br />

respectievelijk nummer. De vervangbare parameters %0 en %1 tot en met %9 kunnen<br />

overal in batchbestanden worden geplaatst. Als het batchbestand wordt gestart, wordt %0<br />

vervangen door de naam van het batchbestand en de argumentparameters %1 tot en met<br />

%9 worden vervangen door de overeenkomstige parameters die op de opdrachtregel zijn<br />

ingevoerd. <strong>MS</strong>-<strong>DOS</strong> herkent dus maar 10 parameters, indien je er meer wenst te gebruiken<br />

dan moet men SHIFT (zie verder..) implementeren.<br />

Vb. 1. Ik maak gebruik van een batchbestand met 2 parameters. De bedoeling is dat<br />

het programmaatje gewoon de inhoud van de parameters op het scherm toont in een<br />

mooi zinnetje.<br />

Het batchbestand ziet er als volgt uit:<br />

Para.bat<br />

echo off<br />

echo.<br />

echo.<br />

echo de %1 voor 1 week %2 = 300 Euro.<br />

echo.<br />

echo.<br />

echo.<br />

echo -- u vroeg: %2, %1 --<br />

para = %0<br />

prijs = %1<br />

madrid = %2<br />

In het batchbestand krijgen de parameters %1 en %2 respectievelijk de waarden ‘prijs’<br />

en ‘madrid’ toegekend.<br />

Pagina<br />

31


2. Als je de inhoud van een map naar een andere map wenst te kopiëren. In het<br />

batchbestand plaats je de volgende instructie.<br />

Xcopy %1\*.* %2<br />

Je start het als volgt op<br />

Voorbeeld2 c:\amap d:\bmap<br />

Het resultaat van deze opdracht is hetzelfde als de volgende opdracht, die men op<br />

de <strong>com</strong>mand prompt zou intikken.<br />

Xcopy c:\amap\*.* d:\bmap<br />

3. De IF-voorwaarde kan hierdoor ook uitgebreid worden. Zie onderstaand voorbeeld.<br />

Het bestand reizen.bat verwerkt ticketaanvragen.<br />

Reizen.bat<br />

@echo off<br />

cls<br />

echo.<br />

if %1==%2 goto fout<br />

if NOT %1==%2 goto ok<br />

:fout<br />

echo Transaction Error!! U vroeg %1 - %2<br />

echo het startpunt kan niet hetzelfde zijn als uw eindpunt.<br />

echo gelieve opnieuw te proberen!<br />

echo.<br />

pause<br />

goto end<br />

:ok<br />

echo uw ticketaanvraag voor %1 - %2 wordt verwerkt<br />

echo u hebt gekozen om in de maand %3 te vertrekken<br />

echo thank you for using ..:Jeff's Travel Escape:..<br />

echo.<br />

pause<br />

:end<br />

Pagina<br />

32


Indien je een parameter wilt doorgeven die bestaat uit 2 woorden dan moet je die omringen<br />

door dubbele quotes.<br />

Pagina<br />

33


For<br />

Voert een bepaalde opdracht uit voor elk bestand in een groep bestanden. Je kunt de opdracht<br />

for gebruiken in elk batchbestand of vanaf de opdrachtregel.<br />

De syntaxis van de opdracht for in een batchprogramma ziet er als volgt uit:<br />

Syntax: for %%variabele in (groep)do opdracht[+param]<br />

Gebruik de volgende syntaxis als je de opdracht for wilt uitvoeren vanaf de opdrachtregel.<br />

Syntax: for %variabele in (groep)do opdracht[+param]<br />

%%variabele en %variabele geven een vervangbare variabele aan. De opdracht<br />

for vervangt %%variabele of (%variabele) met elke tekenreeks in de opgegeven<br />

groep bestanden totdat de opdracht (opgegeven bij param) alle bestanden verwerkt. Namen<br />

van variabelen zijn hoofdlettergevoelig.<br />

Opmerking<br />

- (groep) : een of meer bestanden of tekenreeksen die je wilt verwerken met de<br />

opgegeven opdracht. De haakjes zijn verplicht.<br />

- opdracht : de opdracht die je wilt uitvoeren voor elk bestand in de groep<br />

bestanden.<br />

- param : Eventuele parameters of schakelopties die u wilt gebruiken voor de<br />

opgegeven opdracht (mits de opdracht parameters of schakelopties gebruikt).<br />

..Voor variabele kan je elk willekeurig teken opgeven behalve de cijfers 0 t.e.m. 9, dit om<br />

verwarring met de batchparameters %0 - %9 te voorkomen. Voor eenvoudige<br />

batchprogramma’s is een enkel teken zoals %%F doorgaans voldoende. In <strong>com</strong>plexe<br />

batchprogramma’s kan je meerdere waarden voor variabele gebruiken om de verschillende<br />

vervangbare variabelen te onderscheiden.<br />

..geldige bestandsverzameling<br />

(*.doc)<br />

(*.doc *.txt *.exe)<br />

(jan*.doc jan*.lst)<br />

(ar?99.nrs r??z*.*)<br />

Vb.<br />

1. Stel, je wilt met de opdracht Type de inhoud bekijken van alle bestanden in de<br />

huidige directory et de toevoeging ‘.doc’ of ‘.txt’. Gebruik hiertoe de vervangbare<br />

variabele %F. Dit is echter geen batchbestand, maar moet uitgevoerd worden vanaf<br />

de opdrachtregel.<br />

For %F in (*.doc *.txt) do type %F<br />

Pagina<br />

34


Shift<br />

Wijzigt de positie van vervangbare parameters in een batchbestand.<br />

Syntax: shift<br />

De opdracht shift verandert de waarde van de vervangbare parameters %0 t.e.m. %9 door<br />

elke parameter te kopiëren naar de vorige parameter M.a.w. de waarde van %1 wordt<br />

gekopieerd naar %0, de waarde van %2 wordt gekopieerd naar %1, enz..<br />

Nuttig is het ook wanneer je meer dan 10 parameters wenst te gebruiken. Wanneer je er dan<br />

meer op de opdrachtregel invoert, worden deze na de 10 e parameter (%9) één voor één naar<br />

parameter %9 verplaatst.<br />

De uitvoering van shift is onomkeerbaar. Indien je dus één keer shift uitvoert, kan je de originele<br />

eerste parameter al zeker niet meer terughalen.<br />

Vb. Het volgende batchbestand, genaamd ‘Kopieren.bat’, laat zien hoe de opdracht shift met<br />

een willekeurig aantal parameters kan werken. Het programma kopieert een groep bestanden<br />

naar een directory. De directorynaam en het aantal bestanden vormen de parameters voor dit<br />

programma:<br />

@echo off<br />

rem programma M. Duynslaeger<br />

rem Kopieren.bat kopieert een willekeurig<br />

rem aantal bestanden naar een directory<br />

rem De opdracht is:<br />

rem kopieren dir bestand1 bestand2<br />

set doeldir=%1<br />

:lees<br />

shift<br />

if "%1"=="" goto einde<br />

copy %1 %doeldir%<br />

goto lees<br />

set doeldir=<br />

:einde<br />

echo Alle bestanden gekopieerd<br />

Pagina<br />

35

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!