Sommaire
• Texte de l'archive (2015)
• Notes (2025)
Autres articles
Salut, je vais maintenant, pour ce deuxième épisode des tutos sur FOR. vous présenter un truc très difficile à comprendre au début, mais très rapide à devenir un automatisme. Bon, plutôt que de taper bêtement FOR / ? dans la console, et à apprendre bêtement les syntaxes, lisez consciencieusement ce tuto, et si vous voulez, faites les exercices proposés. 0. Le code minimum (code incomplet qui sera rempli à la fin):: Vous aurez besoin de ça... @echo off cls set /p fichier=Fichier? ^> REM for ... in (%fichier%) do ( set chemin= set lecteur= set chemin2= set nom= set ext= set attributs= set date= set taille= set cheminEtNom= set nomEtExt= REM ) cls echo Chemin d'accès reconnu : %chemin% echo Lettre du lecteur : %lecteur% echo Chemin d'accès "brut" : %chemin2% echo Nom du fichier : %nom% echo Extension : %ext% echo Nom + extension : %nomEtExt% echo Attributs (tapez ATTRIB /? pour l'aide) : %attributs% echo Date et heure du fichier : %date% echo Taille du fichier : %taille% octets echo Chemin d'accès, nom et extension : %cheminEtNom% pause exit
Ce code, mettez le dans un fichier en .bat, il devrait fonctionner, mais il n'affichera bien évidemment pas les variables, qui seront vides. I. La syntaxe Je vous recommende très fortement d'invoquer une variable en majuscule plutôt qu'en minuscule, ou alors les confusions arriveront vite. (l'ordi comprendra, mais vous aurez du mal à vous relire).for %%A in (fichier.txt) do ( echo %%~argumentsA )
Attention! • Déjà ce code ne marchera pas, vous devez adapter la variable et les arguments, mais aussi, si vous mettez une autre lettre que A, il faudra l'adapter également après les arguments! • Ne pas oublier le ~ ! • Ces variables dans FOR sont temporaires, une fois sorti de la boucle for elles n'existent plus, n'hésitez pas à mettre des SET pour les faire exister une fois FOR fini. Plan de la variable substituée : • %% dans un batch, ou % dans la console • arguments → vos arguments (on va y venir!) • A → c'est la variable que vous avez défini dans la première ligne de FOR : celle que vous invoquez au départ, composée de %% et d'un caractère de votre choix. (ex. %%A %%B %%$ %%7 %%0 ...) II. Les arguments La console vous affiche ça :De plus, la substitution de références de variables FOR a été améliorée. Vous pouvez maintenant utiliser la syntaxe optionnelle suivante : %~I - étend %I en supprimant les guillemets (") %~fI - étend %I en nom de chemin d’accès reconnu %~dI - étend %I en lettre de lecteur uniquement %~pI - étend %I en chemin d’accès uniquement %~nI - étend %I en nom de fichier uniquement %~xI - étend %I en extension de fichier uniquement %~sI - chemin étendu contenant uniquement des noms courts %~aI - étend %I en attributs du fichier %~tI - étend %I en date/heure du fichier %~zI - étend %I en taille du fichier %~$PATH:I - parcourt les répertoires de la variable d’environnement PATH et étend %I en nom du premier fichier reconnu trouvé. Si le nom de la variable d’environnement n’est pas défini ou que le fichier n’est pas trouvé par la recherche, alors ce modificateur étend en chaîne vide Vous pouvez combiner les modificateurs pour obtenir des résultats composés : %~dpI - étend %I en lettre de lecteur et chemin d’accès uniquement %~nxI - étend %I en nom de fichier et extension uniquement %~fsI - étend %I en nom de chemin complet avec noms courts uniquement %~dp$PATH:i - parcourt les répertoires listés dans la variable d’environnement PATH à la recherche de %I et étend en lettre de lecteur du premier trouvé. %~ftzaI - étend %I en DIR comme ligne en sortie Dans les exemples ci-dessus %I et PATH peuvent être remplacés par d’autres valeurs valides. La syntaxe %~ se termine par un nom de variable FOR valide. Le choix de noms de variables en capitales comme %I facilite la lecture et empêche toute confusion avec les modificateurs qui ne tiennent pas compte de la casse.
— (c) Microsoft Rappel : dans la console on met % et dans un batch %% ! Donc, si vous voulez utiliser par exemple %~sI (ici la variable est I), vous devrez utiliser ça dans un batch sous cette forme: %%~sI En fait par exemple, vous avez votre variable %%A qui désigne un fichier. %%~pA vous donnera son chemin d'accès uniquement. Si vous avez compris cet exemple, vous comprenez tout. En fait y'a rien à comprendre, ayez sous la main la liste des arguments, soit juste ça :%~I - étend %I en supprimant les guillemets (") %~fI - étend %I en nom de chemin d’accès reconnu %~dI - étend %I en lettre de lecteur uniquement %~pI - étend %I en chemin d’accès uniquement %~nI - étend %I en nom de fichier uniquement %~xI - étend %I en extension de fichier uniquement %~sI - chemin étendu contenant uniquement des noms courts %~aI - étend %I en attributs du fichier %~tI - étend %I en date/heure du fichier %~zI - étend %I en taille du fichier
C'est le principal, sachez juste que vous pouvez faire des mix! III. Les mélanges d'arguments! Alors comment on fait si on veut le chemin d'accès, le nom de fichier, et l'extension? Deux solutions s'offrent à vous: Soit ce code pénible à écrire...for %%A in (fichier.txt) do echo %%~dA%%~pA%%~nA%%~xA
Soit par fusion/mélange:for %%A in (fichier.txt) do echo %%~dpnxA
Arguments utilisés ici: • d → lecteur (disque dur) • p → chemin d'accès • n → nom du fichier • x → extension Mettez donc ça entre le %%~ et votre variable. IV. Autres : Pour utiliser ça dans un if, vous devez mettre des guillemets!if "%%~dpA"=="C:\Users\..." echo ...
Sinon si la variable est transformée en une variable contenant des espaces ça va pas le faire. Comment utiliser ça sans for? Sans for, ça sous entend que c'est le batch qui est entrain de s'exécuter qui est le fichier cible. Vous pouvez faire exactement pareil sauf que la variable sera "O" : un zéro... [NOTE 2025] : pas exactement, c'est une exception à la règle du "%% dans le batch et % dans la console", puisque nous ne sommes pas dans une boucle FOR ici. Il faut bien mettre un seul pourcent. Exemple: mettre ceci dans un fichier nommé "floup.bat" vous sortira donc "floup".@echo off echo %~n0 pause
etc etc etc... Et ceci est très pratique! Retenez que O représente le batch entrain de s'exécuter, je trouve que cette partie est la plus importante et utile de ce tuto! V. Complétion du script initial Reprenez le code, virez les REM, complétez ce for avec la variabe %%F et les lignes SET (exercice). Correction@echo off cls set /p fichier=Fichier? ^> for %%F in (%fichier%) do ( set chemin=%%~F set lecteur=%%~dF set chemin2=%%~pF set nom=%%~nF set ext=%%~xF set attributs=%%~aF set date=%%~tF set taille=%%~zF set cheminEtNom=%%~dpnxF set nomEtExt=%%~nxF ) echo Chemin d'accès reconnu : %chemin% echo Lettre du lecteur : %lecteur% echo Chemin d'accès "brut" : %chemin2% echo Nom du fichier : %nom% echo Extension : %ext% echo Nom + extension : %nomEtExt% echo Attributs (tapez ATTRIB /? pour l'aide) : %attributs% echo Date et heure du fichier : %date% echo Taille du fichier : %taille% octets echo Chemin d'accès, nom et extension : %cheminEtNom% pause exit
VI. EXERCICES!! 1. Quelle est la variable utilisée dans chacun des cas suivants? %%A %%~nxI %%~n$ %%~fL Correction %%A %%I %%$ %%L 2. Est ce que ces variables peuvent êtres utilisées dans un batch ou dans la console directement? %%~xA %~tI %%~n2 %%~dp0 %~dp0 Correction Batch Console Batch Aucun Batch
Notes 2025 :
Le tutoriel ci-dessus a été écrit vers mes 15 ans sur un forum désormais inaccessible. Je l'ai laissé ici tel que je l'avais écrit à l'époque, à l'exception de quelques erreurs de caractères, dans des exemples, qui ne changeaient pas le fond du propos. Il y avait également une autre erreur (j'ai ajouté une note en italique dans le texte de l'archive pour le préciser) : un exemple mentionnait "%%~n0" mais c'est bien "%~n0" qu'il convient de mettre, même si cela déroge à la règle générale du "%% dans le fichier .bat mais % dans une ligne de commande de la console". En réalité cette règle est inhérente à FOR, or, l'utilisation de %0 se fait en dehors d'un FOR et uniquement dans un fichier batch. L'exercice 2 était cependant déjà correct en 2015 : %%~dp0 n'existe pas et %~dp0 a sa place dans un fichier batch. Aussi, l'exercice 3 est absent (en tout cas, pas entier) de mon archive (backup de certains de mes tutoriels, enregistré en 2020). Peut-être que si le contenu du forum est à un moment de nouveau accessible, je pourrai compléter. Je trouve quand même mon tutoriel plus lourd que le chapitre précédent. Si je devais le réécrire aujourd'hui, j'enlèverais l'exemple donné incomplet au début et laissé en exercice pour la fin et finalement peu exploité. En résumé, retenez que l'on met %%~ puis les lettres des arguments que l'on souhaite puis le nom de la variable choisie. (ou %~ si l'on écrit depuis la console) Et que l'on utilise FOR pour désigner un fichier donné, qui sera l'objet de la variable, et qu'en dehors d'une commande FOR, on utilise "0" pour désigner le script en cours d'exécution.