Accueil HGL (général) Articles de blog Articles de blog (filtre : programmation)  

Hugoland - programmation (archives)

Les substitutions de références de variables

Première publication : 2015
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.