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
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
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...