Programmeren in REXX/RexxUtil: verschil tussen versies
Verwijderde inhoud Toegevoegde inhoud
Toevoegen van Directory functie |
Reeks verbeteringen en aanpassing aan conventies. |
||
Regel 20:
call MathLoadFuncs
<br>{{Bericht
|bericht=Het is
|type=info}}
Regel 36:
Geeft voor het station de driveletter, de vrije ruimte, de totale ruimte en het label. Bijvoorbeeld:
say SysDriveInfo("C:") «C: 91855196160 157283799040 SYSTEM»
Pas op, het zijn decimale getallen. Om digitale gigabytes,
==SysDriveMap - lijst van de stationsletters==
'''SysDriveMap'''([station | "<u>C:</u>"][,optie | "<u>USED</u>"])
Geeft een lijst van de gekende stationsletters op het systeem, te beginnen bij ''station''
*USED -
*FREE - geeft enkel de vrije stations;
*LOCAL - geeft enkel de locale stations;
Regel 54:
say SysFileSystemType('C:') /* Geeft misschien "NTFS" */
==RxWinExec - programma uitvoeren (alleen Windows)==
'''RxWinExec'''(commando[,
Deze functie voert het opgegeven Windows commando uit. Het ''commando'' bevat alles wat men anders op de opdrachtprompt zou invoeren, dus parameters incluis.
Als geen expliciet pad is meegegeven in de naam van het commando, dan zoekt REXX achtereenvolgens:
#in de map van waaruit OORexx is opgeroepen;▼
#de huidige map (current directory);
#de Windows systeemmap;
#de Windows map;
#de mappen die in de systeemvariabele "Path" zijn opgegeven.
De optie ''
*'''ShowNormal''': toont een normaal opdrachtvenster;
*'''ShowNoActivate''': toont een opdrachtvenster, doch behoudt het huidig als actief;
Regel 73:
*'''Minimize''': minimaliseert het venster en activeert het hogerliggend venster.
Het resultaat van deze functie is het Process ID (PID) van de toepassing die gestart is. Indien het starten niet is gelukt krijgen we één van volgende
*'''2''', het bestand was niet gevonden;
*'''3''', het opgegeven pad bestaat niet;
*'''11''', het EXE bestand is ongeldig;
*'''-53''', het netwerk-pad is ongeldig.
We hebben hier dus een andere manier om een host-commando uit te voeren.
==SysIni - Windows INI bestanden benaderen==
'''SysIni'''([inifile | "<u>WIN.INI</u>"],applicatie,sleutel,waarde,stem)
Deze functie laat een beperkte toegang toe tot INI bestanden
We kunnen de functie gebruiken om een waarde op te vragen, om er een te zetten of er een te elimineren. Het antwoord van de functie is de opgevraagde waarde, of "" indien het zetten of uitvagen van de waarde is gelukt.
Regel 93:
#'''SysIni([inifile],applicatie,"ALL:","stem")''' om alle sleutels van een applicatie op te vragen. Het resultaat gaat naar de opgegeven stem;
#'''SysIni([inifile],"ALL:","stem")''' om de namen van alle applicaties op te vragen. Het resultaat gaat naar de stem.
Voorbeeld:▼
geeft mogelijks:▼
==SysShutdownSystem - het Windows systeem stoppen==
'''SysShutdownSystem([computer][,bericht][,wachttijd][,appsluiten | <u>0</u>][,herstart | <u>0</u>])
Dank zij deze functie kan het Windows systeem worden gestopt. De parameters zijn:
*Computer = de naam van het systeem op afstand. Zonder computernaam wordt het lokaal systeem gestopt;
*Bericht = een bericht naar de gebruiker;
*Wachttijd = de tijd dat het bericht blijft staan;
*Appsluiten =
*Herstart = het systeem wordt herstart als hier 1 wordt opgegeven.
==SysSleep - het programma pauzeren==
Regel 138 ⟶ 125:
* we een eventuele foutcode terugkrijgen en kunnen testen;
* Windows foutberichten niet op het scherm verschijnen, we kunnen er dus zelf één produceren dat duidelijker of vriendelijker kan zijn voor de gebruiker.
Maar eerst dit nog: vermits dit functies zijn en geen host-commando's, zal de variabele '''rc''' niet gezet worden. Toch spreekt men vaak over returncode voor deze functies, maar die met dan in de variabele '''result''' gezocht worden. Of, we kunnen het ook als volgt oplossen:
rc = Sysfunctie(parameters)
if rc<>0 then .....
==SysFileDelete - een bestand uitvagen==
'''SysFileDelete'''(bestandsnaam)
We mogen geen "wildcards" gebruiken, dus geen *.jpg bijvoorbeeld.
We kunnen o.a. volgende
*'''0''' Alles OK, bestand is verwijderd;
*'''2''' Bestand is niet gevonden;
Regel 150 ⟶ 142:
*'''26''' Niet een DOS disk;
*'''32''' Sharing violation, bestand op andere computer mag alleen gelezen worden;
*'''36''' Sharing buffer overloop;
Laten we het gebruik van deze functie nu eens vergelijken met het rechtstreeks oproepen van het "ERASE" command van Windows:
/* Verschil tussen SysFileErase en ERASE commando */
'ERASE D:\BestandBestaatNiet'
say 'RC='rc
'ERASE D:\DitBestaatWel'
say 'RC='rc
We krijgen het volgende op het scherm:
Kan D:\BestandBestaatNiet niet vinden
RC=0
2 wordt niet herkend als een interne of externe opdracht, programma of batchbestand.
RC=0
0 wordt niet herkend als een interne of externe opdracht, programma of batchbestand.
De eerste zin is het antwoord op het eerste 'ERASE' commando.
Bij de daaropvolgende 'SysFileDelete' functie krijgen we
De tweede 'ERASE' geeft ons helemaal
De daaropvolgende 'SysFileDelete' heeft hetzelfde probleem als de eerste. We moeten dit dus anders schrijven:
/* Verschil tussen SysFileErase en ERASE commando */
'ERASE D:\BestandBestaatNiet'
say 'RC 1 ='rc
call SysFileDelete 'D:\BestandBestaatNiet'
say 'RC 2 ='result
'ERASE D:\DitBestaatWel'
say 'RC 3 ='rc
say 'RC 4 ='SysFileDelete('D:\DitBestaatOok')
We krijgen we:
Kan D:\BestandBestaatNiet niet vinden
RC 1 =0
RC 2 =2
RC 3 =0
RC 4 =0
En we zien dat de SysFileDelete functie ons wel degelijk meer informatie geeft over het wel of niet lukken van de operatie. Het afschrikkend foutbericht krijgen we ook niet, maar ons programma kan aan de hand van de returncode de gebruiker op een vriendelijke manier inlichten.
We herhalen ook nogmaals de uiterst belangrijke regel die we in [[Programmeren in REXX/SysteemCmds#Van levensbelang]] hebben aangehaald ! '''Codeer alles wat niet variabel is als constante, dus tussen aanhalingstekens.'''
==SysFileCopy - een bestand kopiëren==
'''SysFileCopy'''(bronbestand,doelpad)
Regel 177 ⟶ 188:
Bijvoorbeeld:
call SysFileCopy "c:\temp\myfile.txt","d:\myfolder"
Noteer dat een bestaand bestand wordt overschreven.
==SysFileMove - een bestand verplaatsen==
'''SysFileMove'''(bronbestand,doelpad)
Zelfde opmerkingen als voor '''SysFileCopy'''. Nu wordt het bestand van de oorspronkelijke plaats weggenomen nadat het kopiëren naar de nieuwe plaats is gelukt.
Als het bestand in het doelpad al bestaat, dan krijgen we een resultaat 183.
==SysIsFile - bestaat een bestand ?==
'''SysIsFile'''(bestandsnaam)
Regel 192 ⟶ 205:
==SysFileTree - bestanden zoeken==
Veruit de meest gebruikte functie om met bestanden te werken. Het is equivalent aan het DIR commando, maar we krijgen het resultaat rechtstreeks terug in een REXX stem !
'''SysFileTree'''(zoekterm,stem.[,opties | "<u>B</u>"][,tattribuut | "<u>*****</u>"][,nattribuut | "<u>*****</u>"])
De ''zoekterm'' is zoals we met het DIR commando gebruiken, bijvoorbeeld "D:\Fotos\*.jpg". De lijst van de gevonden bestanden wordt in de opgegeven ''stem.'' geplaatst, waarbij de dimensie van de stem, dus het aantal gevonden bestanden, in element 0 wordt gezet.
Een combinatie van één of meer van volgende opties kan worden meegegeven:
*'''F''' enkel voor bestanden zoeken ('''F'''iles)
*'''D''' enkel naar (sub)mappen zoeken ('''D'''irectories)
*'''B''' zowel bestanden als mappen zoeken ('''B'''oth). Dit is de standaard.
*'''S''' zoek recursief,
*'''T'''
*'''L''' geeft de tijd en datum in '''L'''ang formaat
*'''O''' geeft enkel de naam van het bestand. Zonder deze optie worden standaard de datum, tijd, grootte, attributen en naam van de bestanden teruggegeven.
▲Voorbeeld:
call SysFileTree "D:\CMD\E*.rex","bestand.","STF"
do i=1 to bestand.0
say bestand.i
end
▲geeft mogelijks:
09/10/29/17/19 899 A---- D:\CMD\Ebcdic2Ascii.rex
11/02/10/15/08 9057 A---- D:\CMD\ExifTagRoutine.rex
07/10/24/13/44 4008 A---- D:\CMD\ExtractJPG.rex
98/08/10/06/24 2259 A---- D:\CMD\rexxtools\EXEDEMO.REX
Als we de grootte en de attributen van de bestanden niet moeten kennen dan zijn we dus wel beter met de '''L''' optie, want in ons voorbeeld zitten we met een mogelijks jaar-2000 probleempje.
En ook hier weer de opmerking dat de naam van de stem waar het resultaat moet inkomen als constante moet worden geschreven. Doen we dat niet dan riskeren we problemen als iemand '''bestand.="Hello"''' gaat schrijven...
'''Tattribuut''' bepaalt aan welke attributen het bestand moet voldoen.
Het masker is standaard "*****", waarmee alle bestanden worden teruggegeven. Elke positie in het masker kan echter vervangen worden door een '''+''' of '''-''' om aan te duiden dat het bestand het desbetreffend attribuut verplicht wel of niet moet hebben. De volgorde van de attributen zijn '''''ADHRS''''', namelijk '''A'''rchive, '''D'''irectory, '''H'''idden, '''R'''ead-only en '''S'''ystem.
Dus, "*-+**" zou alle verborgen bestanden zoeken
'''Nattribuut''' bepaalt de nieuwe attributen die aan de bestanden moeten worden toegekend. Men kan dus met deze functie attributen van bestanden veranderen. De volgorde van de attributen is weer '''''ADHRS'''' en als er een '''+''' gezet wordt dan wordt het attribuut aangezet. Met een '''-''' wordt het afgezet en met een '''*'''
Voorbeeld:
call SysFileTree "D:\Fotos\IMG_3*.jpg","bestand.","
do i=1 to bestand.0
say bestand.i
end
geeft misschien iets in de aard van:
2009-12-13 15:07:24 7547847 A---- D:\Fotos\IMG_3223.jpg
2009-12-13 15:10:12 6845771 A---- D:\Fotos\IMG_3224.jpg
==SysGetFileDateTime - datum en tijd van bestand opvragen==
'''SysGetFileDateTime'''(bestandsnaam[,type | "<u>A</u>"])
Met deze functie kunnen - indien het bestandssysteem het toelaat - de verschillende tijden van een bestand (of map) opvragen. Het bestand moet toegankelijk zijn en mag niet in gebruik zijn.
Regel 229 ⟶ 253:
*'''A'''ccess - de laatste maal dat het bestand benaderd werd;
*'''W'''rite - de laatste maal dat er naar het bestand is geschreven.
Vergelijk dit met bijvoorbeeld "SysFileTree" waar we enkel de
==SysSetFileDateTime - een nieuwe datum en/of tijd aan een bestand toekennen==
'''SysSetFileDateTime'''(bestandsnaam[,nieuwe_datum][,nieuwe_tijd])
Regel 263 ⟶ 287:
13 DEVICE=C:\DOS\SETVER.EXE
==SysSearchPath - zoeken naar een bestand in een pad==
'''SysSearchPath'''(pad,bestandsnaam[,optie | "<u>C</u>"])
Deze functie gaat na of het ''bestand'' in het opgegeven ''pad'' aanwezig is. Indien wel, dan wordt de volledige naam van het eerste bestand dat voldoet teruggegeven, en wordt er niet meer verder gezocht. Indien geen bestand is gevonden, dan krijgen we een nullstring terug. Het ''pad'' verwijst hier naar een "omgevingsvariabele" die een lijst van mappen bevat. De typische omgevingsvariabelen hiervoor zijn "PATH" en "DPATH".
De ''optie'' geeft aan waar het zoeken moet beginnen:
*'''C''' beginnen van in de huidige map ('''C'''urrent directory) en vervolgens het opgegeven pad
*'''N''' niet in de huidige map beginnen.
Bijvoorbeeld:
Regel 308 ⟶ 332:
=Werken met stems=
==SysStemCopy - een (deel van een) stem kopiëren==
'''SysStemCopy'''(bronstemstem,doelstem[,
Deze functie kopieert elementen van één stem, de ''bronstem'', naar een andere, de ''doelstem''
Het kopiëren begint bij element ''bstart'' van de bronstem. Dit eerste element gaat naar element met index ''dstart'' van de doelstem. Een ''aantal'' elementen kan opgegeven worden, anders wordt alles tot het einde van de bronstem gekopieerd.
Een laatste parameter kan bepalen dat de elementen van de bronstem moeten worden tussengevoegd ('''I'''nserted), ofwel dat de elementen in de doelstem moeten worden vervangen ('''O'''verlay). Tussenvoegen is de standaardoptie.▼
▲Een laatste parameter
Deze functie kan enkel werken met stems waarvan het element nul het aantal bevat, en alle elementen zonder onderbreking opvolgen.▼
▲Deze functie kan enkel werken met stems waarvan
Een returncode -1 betekent dat er problemen zijn opgetreden.▼
Voorbeeld:
Regel 321 ⟶ 347:
Call SysStemCopy "bron.","doel."
Call SysStemCopy "bron.","doel.",1,4,2,"I"
Dit
is
Regel 329 ⟶ 356:
is
==SysStemDelete - elementen uit een stem nemen==
'''SysStemDelete'''(stem,start[,aantal | <u>1</u>])
Deze functie elimineert
Ook deze bewerking kan alleen op stems met numerieke indexen worden uitgevoerd. Na het elimineren van de elementen wordt de stem gecompacteerd, t.t.z. de indexen worden terug opeenvolgend gemaakt.
Regel 337 ⟶ 364:
Deze functie voegt een nieuw element met ''index'' toe aan de ''stem'' en geeft het een ''waarde''. De volgende elementen worden opgeschoven, dus hun indexnummers worden met één verhoogd.
==SysStemSort - een stem sorteren==
'''SysStemSort'''(stem[,
De elementen van de stem (met numerieke indexen) worden geordend. Dit kan in oplopende of aflopende volgorde gebeuren ('''A'''scending
Het sorteren begint bij het element met index ''start'' en eindigt bij het element met index ''einde''.
<!--------------------------------------------------------------------------------------------->
=Andere nuttige functies=
==RxMessageBox - Een bericht in een kadertje==
'''RxMessageBox'''(text[,titel][,knoppen | "<u>OK</u>"][,icoontje])
Met deze functie kunnen we op een eenvoudige wijze een popup-schermpje maken waarin we een bericht kunnen tonen. Dit is vooral nuttig indien ons programma niet vanuit de opdrachtprompt is opgeroepen, maar door een link in het startmenu of een icoon op de desktop. Een '''say''' werkt dan niet omdat er geen scherm is waar het te tonen.
Regel 351 ⟶ 378:
De mogelijke knoppen zijn:
*'''NONE''' (geen knop voorzien):
*'''OK''' - een knop met de tekst "OK" voorzien.
*'''OKCANCEL''' - twee knoppen, een met "OK" en een met "CANCEL";
*'''RETRYCANCEL''' - de knoppen "RETRY" en "CANCEL";
Regel 357 ⟶ 384:
*'''YESNO''' - de knoppen "YES" en "NO";
*'''YESNOCANCEL''' - drie knoppen, "YES", "NO" en "CANCEL";
Een tekst op de knoppen kan niet vertaald worden.
De mogelijke icoontjes zijn:
Regel 370 ⟶ 397:
*'''ERROR''' - een foutteken.
De gebruiker krijgt de mogelijkheid te kiezen tussen verschillende
*'''1''' OK knop;
*'''2''' CANCEL knop (of Esc-toets);
Regel 377 ⟶ 404:
*'''5''' IGNORE knop;
*'''6''' YES knop;
*'''7''' NO knop;
Voorbeeld:
if RxMessageBox("Gaan we verder ?","Vraagje","OKCANCEL","QUESTION")<>1 then exit
==SysDumpVariables - programmavariabelen lijsten==
'''SysDumpVariables'''([doel])
Regel 385 ⟶ 415:
Handig om te debuggen natuurlijk.
Hiermee beëindigen we
{{sub}}
|