home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
RUN Flagazine: Run 14
/
unpacked-run14.zip
/
LES14GWB.ASC
< prev
next >
Wrap
Text File
|
1995-01-01
|
21KB
|
478 lines
DOS, Batches en Basic
Door Ruud Schipper
In deze les van de vervolgcursus gaan wij beginnen met
batches
, eventueel
in samenwerking met het meegeleverde QBasic bij MSDOS. U wordt geacht
enige kennis te hebben van programmeren en u dient te beschikken over een
editor zoals EDIT die met MSDOS is meegeleverd plus de meegeleverde
QBasic. Ook moet u weten hoe u een ascii-file kunt aanmaken/inlezen,
bewerken en bewaren met de editor van uw keuze. De batches dienen in elk
geval als 'schoon' ascii-bestand bewaard te kunnen worden. Het programma
EDIT doet dit in elk geval.
Allereerst: Wat is een batch?
Een batch is een verzameling commando's die niet meer afzonderlijk vanaf
de DOS-prompt behoeven te worden ingetikt. Een voorbeeld is de
AUTOEXEC.BAT die in C:\> (de root directory) staat. Deze batch wordt door
het systeem tijdens het opstarten van de PC uitgevoerd en dient niet
handmatig gestart te worden.
We gaan ons eerst afvragen: Wat wil ik ermee bereiken? Heeft zo'n batch
dan wel zin eigenlijk? Ik zie regelmatig batches RUN.BAT die niets anders
doen dan een programma (COM of EXE) doorstarten.
Een zinloos voorbeeld kan zijn:
[FORMAT.BAT]
@echo off
format
Vergeet niet dat elke batchfile, herkenbaar aan de extensie .BAT een
veelvoud van 1024 bytes inneemt. Heeft u bijvoorbeeld in werkelijkheid
maar 1025 bytes verbruikt, zal deze 2048 bytes innemen op uw (hard)disk.
In bovenstaand voorbeeld [FORMAT.BAT] wordt de FORMAT.COM of de FORMAT.EXE
van uw DOS aangeroepen.
U weet nog dat als er drie bestanden staan onder dezelfde naam, de
volgorde van uitvoering afhankelijk is van de extensie. Dus eerst de .BAT,
dan de .COM en vervolgens de .EXE:
PROGJE.BAT
PROGJE.COM
PROGJE.EXE
Soms kan een dergelijke constructie een virus zijn. In bepaalde gevallen
daarentegen weer niet. Qemm en WordPerfect 6 voor DOS zijn daar een paar
voorbeelden van. Hier komt men achter door met een goede virusscanner te
scannen. Bij veel programma's zien we ook wel eens veel nietszeggende
executables zoals de BAT, COM en EXE genoemd worden in eenzelfde
directory. Met welke moet u dan starten? In ieder geval zoeken of er een
BAT tussenstaat. Zoniet, dan kijken of er een COM is en anders toch wel
een EXE. In veel handleidingen staat wel welke naam u moet intikken.
Wat nu te doen als dat er niet staat. Gewoon alle overige executables
proberen tot u er eentje gevonden hebt die het programma opstarten zoals u
het ervan verwacht. Deze naam noteren. Laten we aannemen dat u RE_PLR.EXE
vindt. Zeer onlogische naam. U zou het kunnen hernoemen. Dit laten sommige
programma's niet toe. U kunt de naam onthouden.
U kunt ook nu zelf een RUN.BAT maken die er dan als volgt uitziet:
[RUN.BAT]
@echo off
re_plr
Dan kan het weer een nuttig doel dienen. Wij gaan nu stoeien met de
archivers zoals PK(UN)ZIP/ARJ/UC2/LZH enzovoorts. Laten wij ARJ als
voorbeeld nemen om iets uit te kunnen pakken. Normaal gaat dit als volgt
met de hand:
ARJ E bestandsnaam
(+ enter ter bevestiging)
Gesteld, we hebben altijd een paar vaste gegevens.
1. Alle archivers staan in het zoekpad evenals de te maken batchfile.
2. Alle archives komen na download terecht in C:\TELIX\DOWN>
3. Alles wat we gaan uitpakken willen we eerst bekijken in
C:\TEMP>
Dus wat weten wij:
ARJ E C:\TELIX\DOWN\??????? C:\TEMP
De vraagtekens weten we nog niet. Wij weten niet welke estandsnaam er aan
een ARJ gegeven wordt. Hiervoor gebruiken wij een variabele die wij in een
batchfile procent 1 (
%1
) noemen.
[PAKUIT.BAT]
@echo off
ARJ E C:\TELIX\DOWN\%1 C:\TEMP
Gesteld dat wij SPEL1.ARJ gedownload hebben en willen bekijken. U hoeft
dan alleen nog maar in te geven:
PAKUIT SPEL1
(enter)
PAKUIT
= naam van de batch
SPEL1
= parameter (variabele) = uit te pakken archive
Nu wordt het lastig als u een variabele vergeet op te geven. Dan wordt het
uitgevoerd op een niet bestaand bestand. Dit willen wij netjes afwerken.
Dan gaat het er zo uitzien:
@ECHO OFF
IF "%1"=="" GOTO niets
ARJ E C:\TELIX\DOWN\%1 C:\TEMP
goto EINDE
:niets
cls
echo.
echo -
echo - Deze batch file dient als volgt gebruikt te worden:
echo -
echo - PAKUIT archivenaam en geef enter
echo -
echo.
:einde
Nu staat er ook een regel in "goto EINDE". Als de batch met een archive
keurig afgewerkt is, willen wij niet dat de foutmelding alsnog verschijnt.
Daarom springen we naar de label: ':einde'. De CLS (CLear Screen)
functioneert net als in Basic als "wis het scherm". Let er ook op dat
"ECHO." gebruikt wordt als een lege regel getoond moet worden. Het
statement
ECHO
komt overeen met PRINT van GWBASIC en QBASIC. Hier valt ook
op dat de tekst niet tussen aanhalingstekens staat.
Net als bij QBasic zijn er labels. In deze batch hebben wij twee labels,
te weten:
:niets
:einde
Ons valt op dat de dubbele punt niet achter maar VOOR de labelnaam staat
in tegenstelling tot het gebruik in QBasic. Alleen is het zeer lastig
doordat er meerdere archive formaten zijn met evenzoveel archivers. Nu
kunnen wij verschillende PAKUIT's gaan schrijven, maar wij kunnen dit ook
onderbrengen in 1 batchfile. Zie hieronder een zo goed als kant en klaar
voorbeeld.
Voorwaarde is wel dat u over de aangeroepen (de-)archivers
(in/uitpakprogramma's moet beschikken in een directory die in uw zoekpad
staat om deze batch te kunnen laten functioneren.
[PAKUIT.BAT]
@echo off
rem IF "%1"=="" GOTO niets
IF EXIST %1.lzh goto LARC
IF EXIST %1.arj goto AR
IF EXIST %1.uc2 goto UC
IF EXIST %1.zip goto ZIPPER
IF NOT EXIST %1.LZH goto END
IF NOT EXIST %1.ARJ goto END
IF NOT EXIST %1.UC2 goto END
IF NOT EXIST %1.ZIP goto END
:LARC
c:
cd\temp
lha e c:\telix\down\%1 c:\temp
goto EINDE2
:AR
ARJ e %1 c:\temp
goto EINDE2
:UC
UC e %1 c:\temp
goto EINDE2
:ZIPPER
PKUNZIP %1 c:\temp
goto EINDE2
:END
cls
echo Fout ontdekt. Er zijn een paar mogelijkheden:
echo 1. Je hebt geen filenaam zonder extensie als parameter
opgeven.
echo 2. De opgegeven file '%1' staat niet in deze directory.
IF NOT EXIST *.LZH goto FOUT1
dir /w *.lzh
:FOUT1
IF NOT EXIST *.ARJ goto FOUT2
echo
---------------------------------------------------------------
dir /w *.arj
echo.
:FOUT2
IF NOT EXIST *.UC2 goto FOUT3
echo
---------------------------------------------------------------
dir /w *.uc2
echo.
:FOUT3
IF NOT EXIST *.ZIP goto EINDE
dir /w *.zip
:EINDE
echo
---------------------------------------------------------------
echo Toets opnieuw in zonder de extensie...
:EINDE2
echo.
GOTO STOPPEN
:niets
cls
echo.
echo -
echo - Deze batch file dient alsvolgt gebruikt te worden:
echo -
echo - PAKUIT archivenaam en geef enter
echo -
echo.
:STOPPEN
Gaat u zich eens afvragen waarom er een "rem" staat voor de %1 regel aan
het begin van deze batchfile.
IF EXIST %1.zip goto ZIPPER
Deze bovenstaande regel kijkt of de ingetikte ZIP bestaat.
IF NOT EXIST %1.LZH goto END
Als de naam.LZH niet bestaat springen we naar label END. Probeert u eens
die batchfile te doorgronden voor de werking.
Tot nu toe hebben wij QBasic nog niet nodig. Waar kan dat IF EXIST / IF
NOT EXIST nu eigenlijk nog meer voor gebruikt worden. In de autoexec batch
misschien? Kijken of dat alle bestanden die vanuit deze batch gestart
worden ook daadwerkelijk (nog) op de harddisk staan, al dan niet in het
opgegeven pad. Zoniet wordt het afgebroken en wordt u tijdig gewaarschuwd
om eventuele schade te beperken tot het minimum.
Wij kunnen bovenstaande batch PAKUIT.BAT nog uitbreiden. Als u de manual
van ARJ leest, komt u ook een verhaal over errorlevels tegen. Hieronder
een werkend voorbeeld met ARJ onder de naam ARJADD.BAT. Deze is
meegeleverd in het pakket.
[ARJADD.BAT]
@echo off
ARJ %1 %2 %3 >nul:
if errorlevel 9 goto not_arj
if errorlevel 8 goto no_memory
if errorlevel 7 goto bad_par
if errorlevel 6 goto cant_open
if errorlevel 5 goto disk_full
if errorlevel 4 goto sec_err
if errorlevel 3 goto crc_err
if errorlevel 2 goto fat_err
if errorlevel 1 goto minor_error
if errorlevel 0 goto arj_oke
:arj_oke
echo Het archive is aangemaakt.
dir *.arj /w
echo
-----------------------------------------------------------------
goto exit
:no_memory
echo Er is niet voldoende geheugen beschikbaar om de ARJ aan te maken.
echo Verwijder eerst enkele TSR's tot u genoeg geheugenruimte hebt.
goto exit
:bad_par
echo U heeft een fout gemaakt in de parameters.
echo.
echo Meest gebruikte is de volgende:
echo.
echo ARJ A %2 %3
echo.
echo ARJ A -R %2 %3
echo.
echo U heeft hetvolgende ingetikt: ARJ %1 %2 %3
echo.
goto exit
:cant_open
echo Ik kan het archive of de file niet vinden die u bedoelt.
dir *.arj /w
echo
-----------------------------------------------------------------
echo.
goto exit
:disk_full
echo Diskette of harddisk is vol. Maak ruimte of ga op een andere
echo drive opnieuw beginnen met inpakken.
goto exit
:sec_err
echo U heeft geprobeerd een ARJ file met securitylevel aan te passen.
echo Hiermee zou het zegel verbroken worden.
echo.
goto exit
:crc_err
echo ATTENTIE !!!
echo Er is een CRC error geconstateerd. Een of meer bestanden zijn
echo al dan niet onherstelbaar beschadigd geraakt.
echo.
goto exit
:fat_err
echo Er is een fatale fout opgetreden. Neem kontakt op met de auteur
echo van de ARJ archiver.
echo.
goto exit
:minor_error
echo Ik kan de files '%3' niet vinden.
echo Het archive '%2' is niet aangemaakt/updated.
echo.
goto exit
:exit
Deze demonstratie ARJADD.BAT batchfile heeft drie variabelen om de werking
goed te laten zien. Een correcte werking krijgt u door het invoeren van:
ARJADD A TESTMIJ *.*
A = %1 (eerste variabele)
TESTMIJ = %2 (tweede variabele)
*.* = %3 (derde variabele)
Speel en experimenteer hiermee en bekijk de uitkomsten. De omleiding van
ARJ is bewust naar ">NUL" omgeleid omdat ARJ in het Engels zelf eerst met
de foutmelding en een lijst komt waarna onze betreffende melding. Nu
verschijnt alleen onze passende melding waar de schoen wringt.
We gaan nu een toepassing bedenken waar we QBasic voor gebruiken.
Allereerst bekijken wij met een dir opdracht in C:\WINDOWS> wat de
opgegeven lengte/grootte van
HIMEM.SYS
is. We houden het heel simpel en
starten QBasic op om het onderstaande in te tikken en te bewaren onder de
naam:
CHECKER.BAS
CLS
'--- controle lengte HIMEM.SYS ---
HOOG1 = 16656 ' File lengte van HIMEM.SYS (windows 3.1)
OPEN "C:\WINDOWS\HIMEM.SYS" FOR BINARY AS#1
HOOG3 = LOF(1)
CLOSE #1
IF HOOG3 = HOOG1 THEN CLS : SYSTEM
BEEP
PRINT "HIMEM.SYS has been altered or is missing"
SYSTEM
Deze controle zouden wij op kunnen nemen in autoexec.bat file met de
volgende regel:
qbasic /run CHECKER.bas
Er wordt uitgegaan dat CHECKER.BAS aangemaakt en bewaart is in de
directory van C:\DOS> waar QBASIC ook staat. Directory DOS staat in het
zoekpad. In plaats van de foutmelding als PRINT opdracht in het programma
kunt u ook uw programma een
ERRORLEVEL
laten genereren die uw batchfile
weer opvangt en al naar gelang het level naar de erbij passende label
springt. Hiermee komt u toch al snel op een compiler. Quickbasic verwacht
een ingewikkelde machinetaal routine of externe te laden library waarmee
je het level kunt aangeven.
Bij deze les vindt u
CHKTST.BAT
die in dezelfde directory moet staan als
ERRTST.EXE omdat deze via de batch CHKTST.BAT aangeroepen wordt. Via dit
ERRTST programma kunt u drie levels genereren om te kijken hoe dit nu
interaktief werkt met de batchfile CHKTST.BAT
Eveneens meegeleverd de broncode in
powerbasic 3.0c
omdat deze taal
in dit geval geen kennis van machinetaal en/of externe libraries vergt
waardoor de source voor u het simpelst leesbaar en volgbaar gehouden kan
worden.
Eerst de batchfile CHKTST.BAT
@ECHO OFF
ERRTST
IF ERRORLEVEL 3 GOTO DRIE
IF ERRORLEVEL 2 GOTO TWEE
IF ERRORLEVEL 1 GOTO EEN
:EEN
ECHO Er is errorlevel 1 gegenereert...
ECHO.
GOTO EXIT
:TWEE
ECHO Er is errorlevel 2 gegenereert...
ECHO.
GOTO EXIT
:DRIE
ECHO Er is errorlevel 3 gegenereert...
ECHO.
GOTO EXIT
:EXIT
Dan de broncode van ERRTST.EXE in powerbasic.
' Geschreven in powerbasic 3.0c
' Gecompileerde versie is meegeleverd
$STRING 1 ' Gebruik niet meer stringruimte dan nodig
$LIB ALL OFF ' Niet alles is nodig dus uitzetten, kleinere EXE!
START:
CLS
PRINT"Demo programma voor genereren errorlevels voor RUN14"
PRINT"Start deze demo op via de meegeleverde CHKTST.BAT batchfile."
PRINT
PRINT"Welk level wilt u genereren."
PRINT
PRINT" 1 = Errorlevel 1"
PRINT" 2 = Errorlevel 2"
PRINT" 3 = Errorlevel 3"
PRINT
PRINT"Maak uw keuze (1-3) ";
INPUT KEUZE
IF KEUZE = 1 THEN PRINT"Terug naar CHKTST.BAT" : END 1
IF KEUZE = 2 THEN PRINT"Terug naar CHKTST.BAT" : END 2
IF KEUZE = 3 THEN PRINT"Terug naar CHKTST.BAT" : END 3
GOTO START
Wilt u zelf experimenteren dan kunt u zich verdiepen in de taal waar u
momenteel de voorkeur aan geeft. U kunt ook de powerbasic tryoutversie +
speciaal add-on programma downloaden of aanvragen bij de lezersservice. De
add-on stelt u in de gelegenheid om de bestaande
ERRTST.BAS
in te lezen in
de tryout ipv het zelf in te tikken. De koopversie heeft die
beperking/omslachtigheid overigens niet. Daarna kunt u in de tryout een
zelf een EXE genereren.
Wij gaan nu terug naar het
HIMEM
voorbeeld eerder in deze les. Wij hebben
het ook al eerder gehad over het ">NUL" gebruik. Hoe kunnen we dat binnen
QBasic (en andere talen) gebruiken.
CLS
'--- controle lengte HIMEM.SYS ---
HOOG1 = 16656 ' File lengte van HIMEM.SYS (windows 3.1)
OPEN "C:\WINDOWS\HIMEM.SYS" FOR BINARY AS#1
HOOG3 = LOF(1)
CLOSE #1
IF HOOG3 = HOOG1 THEN CLS : END
BEEP
PRINT "HIMEM.SYS is aangetast of is er niet"
PRINT "Plaats uw EHBO diskette in drive A: en druk op toets"
WHILE INKEY$ : WEND
DOSUITVOER$ = "copy a:\windows\himem.sys c:\windows >nul"
SHELL dosuitvoer$
CLS
PRINT "Herstart uw computer nu"
END
Nu gebeurt er hetzelfde maar u ziet niet dat de file gekopieerd is. Ofwel
de melding van DOS betreffende in dit geval COPY wordt onderdrukt. In
werkelijkheid wordt de output niet naar het scherm gestuurd.
Tot zover deze (eerste) les over praktisch gebruik van batchfiles en hoe
deze te programmeren.