C3) un peu de programmation

a) DELAY.PAS

Pour ceux qui veulent mettre une pause de durée déterminée dans leurs .BAT, voilà un source en Turbo-Pascal (domaine public):

program delai; uses crt; var w : word; error : integer;

procedure vide_tampon; var c : char; begin while keypressed do c:=readkey ; end;

procedure aide; begin writeln('Syntaxe: erreur '); writeln('sortie: ERRORLEVEL=2 si erreur paramètres'); writeln('sortie: ERRORLEVEL=1 si frappe touche'); writeln('sortie: ERRORLEVEL=0 si exécution normale'); end;

procedure erreur; begin aide; halt(2); end;

procedure touche; begin vide_tampon; halt(1); end;

begin if paramcount <> 1 then erreur; if (paramstr(1)='/H') or (paramstr(1)='/h') or (paramstr(1)='-H') or (paramstr(1)='-H') or (paramstr(1)='/?') or(paramstr(1)='-?') then begin aide;halt(0); end; val(paramstr(1),w,error); if error <> 0 then erreur; vide_tampon; delay(w); if keypressed then touche end.

Bon, on compile pour avoir un DELAY.EXE, on colle le sus-dit EXE dans un répertoire situé dans le PATH, et on fait des batchs du style:

CHOIX.BAT 1 @echo off 2 echo une touche dans les 5 secondes 3 delay 5000 4 if errorlevel 1 goto oui 5 goto non ............

Autrement dit, si on a appuyé sur une touche dans le délai on va à l'étiquette oui sinon on va en non.

b) ASK.PAS

Toujours domaine public, pour lancer des commandes différentes en fonction de la frappe d'une touche (Retour d'un code dans AX et exploitation par ERRORLEVEL, AX=0 si pas de paramètre)

program ask; {$F+} { appels longs pour procédure interruption } uses dos,crt;

var i : byte; c:char; choix,texte:string; int1Bsauve : pointer;

PROCEDURE GestionBreak; INTERRUPT; BEGIN write(#7); END;

begin if paramcount=0 then halt(0); GetIntVec($1B,Int1BSauve); SetIntVec($1B,Addr(GestionBreak)); choix:=paramstr(1); for i:=1 to length(choix) do choix[i]:=upcase(choix[i]); texte:=''; for i:=2 to paramcount do texte:=texte+paramstr(i)+' '; write(texte); repeat c:=upcase(readkey); if c=#3 then write(#7); i:=1; while (choix[i]<>c) and (i Syntaxe : ASK choix_possible texte facultatif

ASK_DEMO.BAT 1 @echo off 2 ask ABC Tapez A, B ou C 3 if errorlevel 3 goto choix-c 4 if errorlevel 2 goto choix-b 5 if errorlevel 1 goto choix-a .......................

c) APPLY.PAS

{$M $4000,0,0 } { 16K de pile, pas de tas } USES Dos,Crt;

var code_erreur,i : integer; fichier_entree : text; commande,ligne,param_exec : string;

procedure afficher_syntaxe; begin writeln('APPLY : répétition d''une commande DOS avec substitution'); writeln(' d''un paramètre pris dans un fichier'); writeln('Syntaxe :APPLY fichier commande'); writeln(' fichier = fichier des paramètres à substituer :'); writeln(' une ligne = un paramètre'); writeln(' commande = commande à exécuter avec ses paramètres'); writeln(' Le caractère * est substitué successivement '); writeln(' par chaque ligne du fichier des paramètres.'); end; { procedure afficher_syntaxe }

procedure erreur(code : integer); begin afficher_syntaxe; case code of 1 : writeln('Nombre de paramètres incorrect'); 2 : writeln('Erreur ouverture fichier ',paramstr(1)); end; halt(code); { fin anormale -> code de sortie <> 0 } end; { procedure erreur }

begin if (paramcount<2) then erreur(1); assign(fichier_entree,paramstr(1)); {$I-} reset(fichier_entree); if ioresult <>0 then erreur(2); {$I+} commande:=''; for i:=2 to paramcount do commande:=commande+' '+paramstr(i); while not eof(fichier_entree) do begin readln(fichier_entree,ligne); param_exec:='/c '+commande; while (pos('*',param_exec)<>0) do begin insert(ligne,param_exec,pos('*',param_exec)); delete(param_exec,pos('*',param_exec),1); end; SwapVectors; exec(getenv('COMSPEC'),param_exec); SwapVectors; IF DosError <> 0 THEN WriteLn(param_exec,' -> Erreur Dos No ', DosError) end; close(fichier_entree); halt(0); { fin normale -> code de sortie = 0 } end.

Comme indiqué dans le source, ça vous permet d'exécuter une commande en lui envoyant des paramètres pris dans un fichier.

Un exemple:

PARAM.TXT 1 r:mail11234.CNM 2 r:mail25678.CNR 3 r:mail3ABCD.PMF

CLEAN.BAT

1 APPLY del param.txt

Ce qui exécutera successivement:

del r:mail11234.CNM del r:mail25678.CNR del r:mail3ABCD.PMF

Bien combiné avec un dir *.CNR /S /B > liste, ça peut nettoyer les messages déjà lus d'une messagerie sous Novell...