home *** CD-ROM | disk | FTP | other *** search
/ RUN Flagazine: Run 14 / unpacked-run14.zip / LES14GWB.ASC < prev    next >
Text File  |  1995-01-01  |  21KB  |  478 lines

  1.  
  2.  
  3.                            DOS, Batches en Basic
  4.                              Door Ruud Schipper
  5.  
  6. In deze les van de vervolgcursus gaan wij beginnen met batches, eventueel
  7. in samenwerking met het meegeleverde QBasic bij MSDOS. U wordt geacht
  8. enige kennis te hebben van programmeren en u dient te beschikken over een
  9. editor zoals EDIT die met MSDOS is meegeleverd plus de meegeleverde
  10. QBasic. Ook moet u weten hoe u een ascii-file kunt aanmaken/inlezen,
  11. bewerken en bewaren met de editor van uw keuze. De batches dienen in elk
  12. geval als 'schoon' ascii-bestand bewaard te kunnen worden. Het programma
  13. EDIT doet dit in elk geval.
  14.  
  15. Allereerst: Wat is een batch?
  16.  
  17. Een batch is een verzameling commando's die niet meer afzonderlijk vanaf
  18. de DOS-prompt behoeven te worden ingetikt. Een voorbeeld is de
  19. AUTOEXEC.BAT die in C:\> (de root directory) staat. Deze batch wordt door
  20. het systeem tijdens het opstarten van de PC uitgevoerd en dient niet
  21. handmatig gestart te worden.
  22. We gaan ons eerst afvragen: Wat wil ik ermee bereiken? Heeft zo'n batch
  23. dan wel zin eigenlijk? Ik zie regelmatig batches RUN.BAT die niets anders
  24. doen dan een programma (COM of EXE) doorstarten.
  25. Een zinloos voorbeeld kan zijn:
  26.  
  27.   [FORMAT.BAT]
  28.  
  29.   @echo off
  30.   format
  31.  
  32. Vergeet niet dat elke batchfile, herkenbaar aan de extensie .BAT een
  33. veelvoud van 1024 bytes inneemt. Heeft u bijvoorbeeld in werkelijkheid
  34. maar 1025 bytes verbruikt, zal deze 2048 bytes innemen op uw (hard)disk.
  35. In bovenstaand voorbeeld [FORMAT.BAT] wordt de FORMAT.COM of de FORMAT.EXE
  36. van uw DOS aangeroepen.
  37. U weet nog dat als er drie bestanden staan onder dezelfde naam, de
  38. volgorde van uitvoering afhankelijk is van de extensie. Dus eerst de .BAT,
  39. dan de .COM en vervolgens de .EXE:
  40.  
  41.   PROGJE.BAT
  42.   PROGJE.COM
  43.   PROGJE.EXE
  44.  
  45. Soms kan een dergelijke constructie een virus zijn. In bepaalde gevallen
  46. daarentegen weer niet. Qemm en WordPerfect 6 voor DOS zijn daar een paar
  47. voorbeelden van. Hier komt men achter door met een goede virusscanner te
  48. scannen. Bij veel programma's zien we ook wel eens veel nietszeggende
  49. executables zoals de BAT, COM en EXE genoemd worden in eenzelfde
  50. directory. Met welke moet u dan starten? In ieder geval zoeken of er een
  51. BAT tussenstaat. Zoniet, dan kijken of er een COM is en anders toch wel
  52. een EXE. In veel handleidingen staat wel welke naam u moet intikken.
  53. Wat nu te doen als dat er niet staat. Gewoon alle overige executables
  54. proberen tot u er eentje gevonden hebt die het programma opstarten zoals u
  55. het ervan verwacht. Deze naam noteren. Laten we aannemen dat u RE_PLR.EXE
  56. vindt. Zeer onlogische naam. U zou het kunnen hernoemen. Dit laten sommige
  57. programma's niet toe. U kunt de naam onthouden.
  58. U kunt ook nu zelf een RUN.BAT maken die er dan als volgt uitziet:
  59.  
  60.    [RUN.BAT]
  61.  
  62.    @echo off
  63.    re_plr
  64.  
  65. Dan kan het weer een nuttig doel dienen. Wij gaan nu stoeien met de
  66. archivers zoals PK(UN)ZIP/ARJ/UC2/LZH enzovoorts. Laten wij ARJ als
  67. voorbeeld nemen om iets uit te kunnen pakken. Normaal gaat dit als volgt
  68. met de hand:
  69.  
  70.   ARJ E bestandsnaam   (+ enter ter bevestiging)
  71.  
  72. Gesteld, we hebben altijd een paar vaste gegevens.
  73.  
  74. 1. Alle archivers staan in het zoekpad evenals de te maken batchfile.
  75. 2. Alle archives komen na download terecht in C:\TELIX\DOWN>
  76. 3. Alles wat we gaan uitpakken willen we eerst bekijken in
  77.  
  78.    C:\TEMP>
  79.  
  80. Dus wat weten wij:
  81.  
  82.    ARJ E C:\TELIX\DOWN\??????? C:\TEMP
  83.  
  84. De vraagtekens weten we nog niet. Wij weten niet welke estandsnaam er aan
  85. een ARJ gegeven wordt. Hiervoor gebruiken wij een variabele die wij in een
  86. batchfile procent 1 (%1) noemen.
  87.  
  88.    [PAKUIT.BAT]
  89.  
  90.    @echo off
  91.    ARJ E C:\TELIX\DOWN\%1 C:\TEMP
  92.  
  93. Gesteld dat wij SPEL1.ARJ gedownload hebben en willen bekijken. U hoeft
  94. dan alleen nog maar in te geven:
  95.  
  96.    PAKUIT SPEL1  (enter)
  97.  
  98.    PAKUIT = naam van de batch
  99.    SPEL1  = parameter (variabele) = uit te pakken archive
  100.  
  101. Nu wordt het lastig als u een variabele vergeet op te geven. Dan wordt het
  102. uitgevoerd op een niet bestaand bestand. Dit willen wij netjes afwerken.
  103. Dan gaat het er zo uitzien:
  104.  
  105.    @ECHO OFF
  106.    IF "%1"=="" GOTO niets
  107.    ARJ E C:\TELIX\DOWN\%1 C:\TEMP
  108.    goto EINDE
  109.    :niets                                                                 
  110.    cls
  111.    echo.
  112.    echo -
  113.    echo -     Deze batch file dient als volgt gebruikt te worden:
  114.    echo -
  115.    echo -     PAKUIT archivenaam     en geef enter
  116.    echo -
  117.    echo.
  118.    :einde
  119.  
  120.  
  121. Nu staat er ook een regel in "goto EINDE". Als de batch met een archive
  122. keurig afgewerkt is, willen wij niet dat de foutmelding alsnog verschijnt.
  123. Daarom springen we naar de label: ':einde'. De CLS (CLear Screen)
  124. functioneert net als in Basic als "wis het scherm". Let er ook op dat
  125. "ECHO." gebruikt wordt als een lege regel getoond moet worden. Het
  126. statement ECHO komt overeen met PRINT van GWBASIC en QBASIC. Hier valt ook
  127. op dat de tekst niet tussen aanhalingstekens staat.
  128. Net als bij QBasic zijn er labels. In deze batch hebben wij twee labels,
  129. te weten:
  130.  
  131.    :niets
  132.    :einde
  133.  
  134. Ons valt op dat de dubbele punt niet achter maar VOOR de labelnaam staat
  135. in tegenstelling tot het gebruik in QBasic. Alleen is het zeer lastig
  136. doordat er meerdere archive formaten zijn met evenzoveel archivers. Nu
  137. kunnen wij verschillende PAKUIT's gaan schrijven, maar wij kunnen dit ook
  138. onderbrengen in 1 batchfile. Zie hieronder een zo goed als kant en klaar
  139. voorbeeld.
  140. Voorwaarde is wel dat u over de aangeroepen (de-)archivers
  141. (in/uitpakprogramma's moet beschikken in een directory die in uw zoekpad
  142. staat om deze batch te kunnen laten functioneren.
  143.  
  144.    [PAKUIT.BAT]  
  145.  
  146.    @echo off
  147.  
  148.    rem IF "%1"=="" GOTO niets
  149.  
  150.    IF EXIST %1.lzh goto LARC
  151.    IF EXIST %1.arj goto AR
  152.    IF EXIST %1.uc2 goto UC
  153.    IF EXIST %1.zip goto ZIPPER
  154.    IF NOT EXIST %1.LZH goto END
  155.    IF NOT EXIST %1.ARJ goto END
  156.    IF NOT EXIST %1.UC2 goto END
  157.    IF NOT EXIST %1.ZIP goto END
  158.  
  159.    :LARC
  160.    c:
  161.    cd\temp
  162.    lha e c:\telix\down\%1 c:\temp
  163.    goto EINDE2
  164.  
  165.    :AR
  166.    ARJ e %1 c:\temp
  167.    goto EINDE2
  168.  
  169.    :UC
  170.    UC e %1 c:\temp
  171.    goto EINDE2
  172.  
  173.    :ZIPPER
  174.    PKUNZIP %1 c:\temp
  175.    goto EINDE2
  176.  
  177.    :END
  178.    cls
  179.    echo Fout ontdekt. Er zijn een paar mogelijkheden:
  180.    echo 1. Je hebt geen filenaam zonder extensie als parameter
  181.  
  182.    opgeven.
  183.    echo 2. De opgegeven file '%1' staat niet in deze directory.
  184.    IF NOT EXIST *.LZH goto FOUT1
  185.    dir /w *.lzh
  186.    :FOUT1
  187.    IF NOT EXIST *.ARJ goto FOUT2
  188.    echo
  189. ---------------------------------------------------------------
  190.    dir /w *.arj 
  191.    echo.
  192.    :FOUT2
  193.    IF NOT EXIST *.UC2 goto FOUT3 
  194.    echo
  195. ---------------------------------------------------------------
  196.    dir /w *.uc2
  197.    echo.
  198.    :FOUT3
  199.    IF NOT EXIST *.ZIP goto EINDE
  200.    dir /w *.zip
  201.  
  202.    :EINDE
  203.    echo
  204. ---------------------------------------------------------------
  205.    echo Toets opnieuw in zonder de extensie...
  206.    :EINDE2 
  207.    echo.
  208.    GOTO STOPPEN
  209.  
  210.    :niets
  211.    cls
  212.    echo.
  213.    echo -
  214.    echo -     Deze batch file dient alsvolgt gebruikt te worden:
  215.    echo -
  216.    echo -     PAKUIT archivenaam     en geef enter
  217.    echo -
  218.    echo.
  219.  
  220.    :STOPPEN
  221.  
  222.  
  223. Gaat u zich eens afvragen waarom er een "rem" staat voor de %1 regel aan
  224. het begin van deze batchfile.
  225.  
  226.    IF EXIST %1.zip goto ZIPPER
  227.  
  228. Deze bovenstaande regel kijkt of de ingetikte ZIP bestaat.
  229.  
  230.    IF NOT EXIST %1.LZH goto END
  231.  
  232. Als de naam.LZH niet bestaat springen we naar label END. Probeert u eens
  233. die batchfile te doorgronden voor de werking.
  234. Tot nu toe hebben wij QBasic nog niet nodig. Waar kan dat IF EXIST / IF
  235. NOT EXIST nu eigenlijk nog meer voor gebruikt worden. In de autoexec batch
  236. misschien? Kijken of dat alle bestanden die vanuit deze batch gestart
  237. worden ook daadwerkelijk (nog) op de harddisk staan, al dan niet in het
  238. opgegeven pad. Zoniet wordt het afgebroken en wordt u tijdig gewaarschuwd
  239. om eventuele schade te beperken tot het minimum.
  240. Wij kunnen bovenstaande batch PAKUIT.BAT nog uitbreiden. Als u de manual
  241. van ARJ leest, komt u ook een verhaal over errorlevels tegen. Hieronder
  242. een werkend voorbeeld met ARJ onder de naam ARJADD.BAT. Deze is
  243. meegeleverd in het pakket.
  244.  
  245.    [ARJADD.BAT]
  246.  
  247.    @echo off  
  248.    ARJ %1 %2 %3 >nul:
  249.    if errorlevel 9 goto not_arj
  250.    if errorlevel 8 goto no_memory
  251.    if errorlevel 7 goto bad_par
  252.    if errorlevel 6 goto cant_open
  253.    if errorlevel 5 goto disk_full
  254.    if errorlevel 4 goto sec_err
  255.    if errorlevel 3 goto crc_err 
  256.    if errorlevel 2 goto fat_err
  257.    if errorlevel 1 goto minor_error
  258.    if errorlevel 0 goto arj_oke  
  259.  
  260.    :arj_oke
  261.    echo Het archive is aangemaakt.
  262.    dir *.arj /w 
  263.    echo
  264. -----------------------------------------------------------------
  265.    goto exit
  266.  
  267.    :no_memory
  268.    echo Er is niet voldoende geheugen beschikbaar om de ARJ aan te maken.
  269.    echo Verwijder eerst enkele TSR's tot u genoeg geheugenruimte hebt.
  270.    goto exit
  271.  
  272.    :bad_par
  273.    echo U heeft een fout gemaakt in de parameters.
  274.    echo.
  275.    echo Meest gebruikte is de volgende:
  276.    echo.
  277.    echo     ARJ A %2 %3
  278.    echo.
  279.    echo     ARJ A -R %2 %3
  280.    echo.
  281.    echo U heeft hetvolgende ingetikt: ARJ %1 %2 %3
  282.    echo.
  283.    goto exit
  284.  
  285.    :cant_open  
  286.    echo Ik kan het archive of de file niet vinden die u bedoelt.
  287.    dir *.arj /w 
  288.    echo
  289. -----------------------------------------------------------------
  290.    echo.
  291.    goto exit
  292.  
  293.    :disk_full
  294.    echo Diskette of harddisk is vol. Maak ruimte of ga op een andere
  295.    echo drive opnieuw beginnen met inpakken.
  296.    goto exit
  297.    :sec_err
  298.    echo U heeft geprobeerd een ARJ file met securitylevel aan te passen.
  299.    echo Hiermee zou het zegel verbroken worden.
  300.    echo.
  301.    goto exit
  302.  
  303.    :crc_err
  304.    echo ATTENTIE !!!
  305.    echo Er is een CRC error geconstateerd. Een of meer bestanden zijn
  306.    echo al dan niet onherstelbaar beschadigd geraakt.
  307.    echo.
  308.    goto exit
  309.  
  310.    :fat_err
  311.    echo Er is een fatale fout opgetreden. Neem kontakt op met de auteur
  312.    echo van de ARJ archiver.
  313.    echo.
  314.    goto exit
  315.  
  316.    :minor_error 
  317.    echo Ik kan de files '%3' niet vinden.
  318.    echo Het archive '%2' is niet aangemaakt/updated.
  319.    echo.
  320.    goto exit
  321.  
  322.    :exit
  323.  
  324. Deze demonstratie ARJADD.BAT batchfile heeft drie variabelen om de werking
  325. goed te laten zien. Een correcte werking krijgt u door het invoeren van:
  326.  
  327.    ARJADD A TESTMIJ *.*  
  328.  
  329.                A = %1 (eerste variabele) 
  330.          TESTMIJ = %2 (tweede variabele) 
  331.              *.* = %3 (derde variabele)
  332.  
  333. Speel en experimenteer hiermee en bekijk de uitkomsten. De omleiding van
  334. ARJ is bewust naar ">NUL" omgeleid omdat ARJ in het Engels zelf eerst met
  335. de foutmelding en een lijst komt waarna onze betreffende melding. Nu
  336. verschijnt alleen onze passende melding waar de schoen wringt.
  337. We gaan nu een toepassing bedenken waar we QBasic voor gebruiken.
  338. Allereerst bekijken wij met een dir opdracht in C:\WINDOWS> wat de
  339. opgegeven lengte/grootte van HIMEM.SYS is. We houden het heel simpel en
  340. starten QBasic op om het onderstaande in te tikken en te bewaren onder de
  341. naam: CHECKER.BAS 
  342.  
  343.       CLS
  344.       '--- controle lengte HIMEM.SYS --- 
  345.       HOOG1  = 16656      ' File lengte van HIMEM.SYS (windows 3.1) 
  346.  
  347.       OPEN "C:\WINDOWS\HIMEM.SYS" FOR BINARY AS#1
  348.       HOOG3 = LOF(1)
  349.       CLOSE #1
  350.  
  351.       IF HOOG3 = HOOG1 THEN CLS : SYSTEM  
  352.  
  353.       BEEP
  354.       PRINT "HIMEM.SYS has been altered or is missing" 
  355.       SYSTEM
  356.  
  357. Deze controle zouden wij op kunnen nemen in autoexec.bat file met de
  358. volgende regel:
  359.  
  360.       qbasic /run CHECKER.bas
  361.  
  362. Er wordt uitgegaan dat CHECKER.BAS aangemaakt en bewaart is in de
  363. directory van C:\DOS> waar QBASIC ook staat. Directory DOS staat in het
  364. zoekpad. In plaats van de foutmelding als PRINT opdracht in het programma
  365. kunt u ook uw programma een ERRORLEVEL laten genereren die uw batchfile
  366. weer opvangt en al naar gelang het level naar de erbij passende label
  367. springt. Hiermee komt u toch al snel op een compiler. Quickbasic verwacht
  368. een ingewikkelde machinetaal routine of externe te laden library waarmee
  369. je het level kunt aangeven.
  370. Bij deze les vindt u CHKTST.BAT die in dezelfde directory moet staan als
  371. ERRTST.EXE omdat deze via de batch CHKTST.BAT aangeroepen wordt. Via dit
  372. ERRTST programma kunt u drie levels genereren om te kijken hoe dit nu
  373. interaktief werkt met de batchfile CHKTST.BAT
  374.  
  375. Eveneens meegeleverd de broncode in powerbasic 3.0c omdat deze taal
  376. in dit geval geen kennis van machinetaal en/of externe libraries vergt
  377. waardoor de source voor u het simpelst leesbaar en volgbaar gehouden kan
  378. worden.
  379.  
  380. Eerst de batchfile CHKTST.BAT
  381.  
  382.       @ECHO OFF
  383.       ERRTST
  384.       IF ERRORLEVEL 3 GOTO DRIE 
  385.       IF ERRORLEVEL 2 GOTO TWEE 
  386.       IF ERRORLEVEL 1 GOTO EEN
  387.  
  388.       :EEN
  389.       ECHO Er is errorlevel 1 gegenereert...
  390.       ECHO.
  391.       GOTO EXIT
  392.  
  393.  
  394.       :TWEE
  395.       ECHO Er is errorlevel 2 gegenereert...
  396.       ECHO.
  397.       GOTO EXIT
  398.  
  399.       :DRIE
  400.       ECHO Er is errorlevel 3 gegenereert...
  401.       ECHO.
  402.       GOTO EXIT
  403.  
  404.       :EXIT
  405.  
  406. Dan de broncode van ERRTST.EXE in powerbasic.
  407.  
  408.       ' Geschreven in powerbasic 3.0c  
  409.       ' Gecompileerde versie is meegeleverd
  410.  
  411.       $STRING 1        ' Gebruik niet meer stringruimte dan nodig
  412.       $LIB ALL OFF     ' Niet alles is nodig dus uitzetten, kleinere EXE!
  413.  
  414.  
  415.       START:
  416.  
  417.       CLS
  418.       PRINT"Demo programma voor genereren errorlevels voor RUN14"
  419.       PRINT"Start deze demo op via de meegeleverde CHKTST.BAT batchfile."
  420.       PRINT
  421.       PRINT"Welk level wilt u genereren."
  422.       PRINT
  423.       PRINT"   1 = Errorlevel 1"
  424.       PRINT"   2 = Errorlevel 2" 
  425.       PRINT"   3 = Errorlevel 3" 
  426.       PRINT
  427.       PRINT"Maak uw keuze (1-3) ";
  428.       INPUT KEUZE
  429.  
  430.       IF KEUZE = 1 THEN PRINT"Terug naar CHKTST.BAT" : END 1 
  431.       IF KEUZE = 2 THEN PRINT"Terug naar CHKTST.BAT" : END 2  
  432.       IF KEUZE = 3 THEN PRINT"Terug naar CHKTST.BAT" : END 3
  433.  
  434.       GOTO START
  435.  
  436. Wilt u zelf experimenteren dan kunt u zich verdiepen in de taal waar u
  437. momenteel de voorkeur aan geeft. U kunt ook de powerbasic tryoutversie +  
  438. speciaal add-on programma downloaden of aanvragen bij de lezersservice. De
  439. add-on stelt u in de gelegenheid om de bestaande ERRTST.BAS in te lezen in
  440. de tryout ipv het zelf in te tikken. De koopversie heeft die
  441. beperking/omslachtigheid overigens niet. Daarna kunt u in de tryout een
  442. zelf een EXE genereren.
  443.  
  444. Wij gaan nu terug naar het HIMEM voorbeeld eerder in deze les. Wij hebben
  445. het ook al eerder gehad over het ">NUL" gebruik. Hoe kunnen we dat binnen
  446. QBasic (en andere talen) gebruiken.
  447.  
  448.  
  449.       CLS
  450.       '--- controle lengte HIMEM.SYS --- 
  451.       HOOG1  = 16656      ' File lengte van HIMEM.SYS (windows 3.1)
  452.  
  453.       OPEN "C:\WINDOWS\HIMEM.SYS" FOR BINARY AS#1
  454.       HOOG3 = LOF(1)
  455.       CLOSE #1
  456.  
  457.       IF HOOG3 = HOOG1 THEN CLS : END
  458.  
  459.       BEEP
  460.       PRINT "HIMEM.SYS is aangetast of is er niet"
  461.       PRINT "Plaats uw EHBO diskette in drive A: en druk op toets"
  462.       WHILE INKEY$ : WEND
  463.  
  464.       DOSUITVOER$ = "copy a:\windows\himem.sys c:\windows >nul"
  465.  
  466.       SHELL dosuitvoer$
  467.  
  468.       CLS
  469.       PRINT "Herstart uw computer nu"
  470.       END
  471.  
  472.  
  473. Nu gebeurt er hetzelfde maar u ziet niet dat de file gekopieerd is. Ofwel
  474. de melding van DOS betreffende in dit geval COPY wordt onderdrukt. In
  475. werkelijkheid wordt de output niet naar het scherm gestuurd.
  476. Tot zover deze (eerste) les over praktisch gebruik van batchfiles en hoe
  477. deze te programmeren.
  478.