Détecter un périphérique en fonction d’un fichier
Sommaire
I. Présentation
Si vous souhaitez exécuter un script qui effectuera une action entre la machine et une clé USB par exemple, il faudra vérifier le script avant chaque exécution pour voir si la lettre indiquée dans le script correspond à la lettre du lecteur de votre clé USB. Du coup, c'est un peu ennuyeux de devoir faire cela à chaque fois que vous changez de machine. Pire encore, imaginez que ce script sera utilisé par des personnes qui ne connaissent pas grand chose en informatique et qui ne sont pas capables de vérifier la cohérence du script, vous faites comment ? Nous allons voir dans ce tutoriel une solution qui consiste à accéder aux différentes lettres de lecteur disponible jusqu'à trouver un fichier précis, qui devra être indiqué dans le script. Dès que ce fichier sera trouvé sur le périphérique, le script se dira "J'ai trouvé le lecteur sur lequel je dois effectuer l'opération, je peux donc commencer". Ce script utilise le langage Batch, il est donc exécutable à partir d'un poste sous Windows.
II. Le code complet
Voici le code complet du script, des explications seront apportées dans la partie suivante.
@echo off set FILENAME=autorun.inf set DRIVERLIST=a,b,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,d,c FOR %%d in (%DRIVERLIST%) do ( FOR /F "delims=" %%f in ('dir /B /S %%d:\%FILENAME%') do ( set LETTER=%%d IF EXIST "%%d:\%FILENAME%" goto TRAITEMENT ) ) :TRAITEMENT echo Fichier trouvé dans le lecteur %LETTER% ! --- Votre code de traitement à insérer ici exit
III. Explications
Avoir un bout de code c'est bien mais avoir des explications pour l'accompagner c'est encore mieux et ça vous permet de comprendre ce que vous faites. D'un point de vue global voici comment fonctionne le script :
On définit un nom de fichier à chercher (variable FILENAME) et un ensemble de lettres correspondant aux lettres de lecteurs à vérifier (variable DRIVERLIST). Ensuite, grâce à une boucle FOR on fait une vérification (DO : Faire...) où l'on prend une lettre de lecteur en commençant par la première de la liste pour vérifier sur ce lecteur si un fichier se nomme de la valeur FILENAME. Pour vérifier cela on refait une deuxième boucle FOR à l'intérieur de la première où l'on liste tous les fichiers du lecteur pour voir si un nom de fichier correspond à ce qu'on cherche. Dès que le fichier est trouvé (IF EXIST : S'il existe...), on va à l'étiquette TRAITEMENT c'est à dire qu'on se déplace dans le code jusqu'à trouver le début de l'étiquette TRAITEMENT et on continue à exécuter le code. C'est là que votre code de traitement devra être placé et devra intervenir pour effectuer vos opérations sur le lecteur.
Quelques informations en plus :
- "set" : Permet de définir des variables, représentées par FILENAME et DRIVERLIST dans ce programme.
- "dir" : Cette commande permet de lister le contenu d'un répertoire, l'option /B permet de lister uniquement les noms de fichiers (et non la date de création, etc...) et l'option /S permet de lister l'ensemble des répertoires et sous-répertoire, donc toute l'arborescence.
- "delims=" : Ceci permet d'indiquer un délimiteur qui dans notre cas est vide puisque lors du listing des fichiers, il n'y a pas de caractères en fin de ligne.
- "goto" : Cette directive permet de dire "Aller à..." où on indique après le nom d'une étiquette afin d'aller à un endroit du programme. Dans notre cas TRAITEMENT.
V. Pourquoi les lettres C et D à la fin ?
Il vaut mieux placer les lettres C et D à la fin de la liste car ce serait très long de scanner l'ensemble des fichiers de la partition C qui est en général la partition système, et D peut être éventuellement une partition de données. De plus si l'on cherche un autorun, on a peu de chance de le trouver.
Si vous avez des améliorations à me proposer ou une solution alternative, n'hésitez pas à laisser un commentaire ou directement utiliser le forum pour en discuter.
Plus simple :
@ECHO OFF
SET dd=%~d0
ECHO letter=%dd%
pause
Bonjour,
Comment obtenir l’équivalent de cet excellent tuto en PowerShell ?