MS-DOS Batch Files .. - Ruudoleo.com
MS-DOS Batch Files .. - Ruudoleo.com
MS-DOS Batch Files .. - Ruudoleo.com
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