OVH Cloud OVH Cloud

utilisation de FOR

11 réponses
Avatar
marc.dufresne
bonjour
comment utiliser correctement FOR quelle syntaxe pour vérifier tous les
répertoire à l'intérieur d'un répertoire parent mais rien que les
répertoires et pas celui parent
merci

10 réponses

1 2
Avatar
Do Re Mi chel La Si Do
Bonjour !


Le plus simple, c'est de passer par un DIR et un fichier temporaire.

Exemple :

@echo off
dir *.* /A:D /B>TEMP.TXT
for /F %%i in (TEMP.TXT) do (call :TRT %%i)
del TEMP.TXT
goto :EOF

:TRT
echo %1
goto :EOF


Dans le sous-programme :TRT on effectue les traitements

Explications, sur le DIR :
/A:D ne liste que les répertoires
/B mode "sobre", ne donne que le nom, sans fioritures
/S si l'on voulait aussi les sous-répertoires.


@-salutations

Michel Claveau
Avatar
Jacques Barathon [MS]
Attention à la présence d'espaces dans les noms de répertoires. Par défaut,
le FOR ne va prendre que le premier mot. Par exemple le répertoire "Mes
Documents" ne retournera que "Mes". Il faut préciser qu'on veut tous les
mots en ajoutant "tokens=*".

De plus, tu peux t'épargner l'usage du fichier temporaire en passant la
commande DIR en paramètre au lieu du fichier.

Enfin, si ta section :TRT n'inclut qu'une seule commande, tu peux éviter le
CALL et mettre directement la commande en fin de ligne "for ... do".

Le résultat final peut donc ressembler à ceci:

@echo off
for /f "tokens=*" %%i in ('dir *.* /a:d /b') do echo %%i

Jacques

"Do Re Mi chel La Si Do" wrote in message
news:
Bonjour !


Le plus simple, c'est de passer par un DIR et un fichier temporaire.

Exemple :

@echo off
dir *.* /A:D /B>TEMP.TXT
for /F %%i in (TEMP.TXT) do (call :TRT %%i)
del TEMP.TXT
goto :EOF

:TRT
echo %1
goto :EOF


Dans le sous-programme :TRT on effectue les traitements

Explications, sur le DIR :
/A:D ne liste que les répertoires
/B mode "sobre", ne donne que le nom, sans fioritures
/S si l'on voulait aussi les sous-répertoires.


@-salutations

Michel Claveau





Avatar
Do Re Mi chel La Si Do
Bonsoir !


Attention à la présence d'espaces dans les noms de répertoires. Par
défaut, le FOR ne va prendre que le premier mot. Par exemple le
répertoire "Mes Documents" ne retournera que "Mes". Il faut préciser
qu'on veut tous les mots en ajoutant "tokens=*".




Exact.



De plus, tu peux t'épargner l'usage du fichier temporaire en passant la
commande DIR en paramètre au lieu du fichier.




Oui, mais, comme souvent, je filtre, ça ne passe plus dans le FOR. Dans les
cas simples, je suis d'accord. Mais perso, je préfèrerais utiliser :
for /F "usebackq tokens=*" %%i in (`dir *.* /A:D /B`) do (echo %%i)
Mais, bon, question d'habitude.



Enfin, si ta section :TRT n'inclut qu'une seule commande, tu peux éviter
le CALL et mettre directement la commande en fin de ligne "for ... do".




C'est vrai, mais seulement pour les commandes simples.

Autre problème du CALL interne : s'il y a un espace dans le nom du
répertoire, il faudra utiliser %* dans :TRT, faute de quoi on ne récupèrera
que le premier mot.

Sinon, on peut aussi avoir des problèmes avec les répertoires systèmes, les
répertoires invisibles, les noms en unicode, etc.



Globalement, on est d'accord. Mon exemple se voulait simple à comprendre.



@-salutations
--
Michel Claveau



Avatar
Jacques Barathon [MS]
"Do Re Mi chel La Si Do" wrote in message
news:%23i2f%
De plus, tu peux t'épargner l'usage du fichier temporaire en passant la
commande DIR en paramètre au lieu du fichier.




Oui, mais, comme souvent, je filtre, ça ne passe plus dans le FOR. Dans
les cas simples, je suis d'accord. Mais perso, je préfèrerais utiliser :
for /F "usebackq tokens=*" %%i in (`dir *.* /A:D /B`) do (echo
%%i)
Mais, bon, question d'habitude.


En effet, question d'habitude. Mais comme tu dis, si on veut passer une
série de commandes qui incluent un filtre, il vaut mieux traiter ça via un
fichier temporaire avant la commande FOR.

Enfin, si ta section :TRT n'inclut qu'une seule commande, tu peux éviter
le CALL et mettre directement la commande en fin de ligne "for ... do".




C'est vrai, mais seulement pour les commandes simples.


En effet, c'est pour ça que j'ai précisé "si ta section n'inclut qu'une
seule commande. Dans ce cas, il est bcp plus simple de traiter la commande
directement sur la même ligne.

Autre problème du CALL interne : s'il y a un espace dans le nom du
répertoire, il faudra utiliser %* dans :TRT, faute de quoi on ne
récupèrera que le premier mot.

Sinon, on peut aussi avoir des problèmes avec les répertoires systèmes,
les répertoires invisibles, les noms en unicode, etc.


Tout à fait Michel.

Globalement, on est d'accord. Mon exemple se voulait simple à comprendre.


Bien compris. Mes précisions se voulaient tout aussi simples. En espérant
que tout cela n'aura pas embrouillé l'esprit de Marc. :-)

Jacques




Avatar
marc.dufresne
bonjour
je vous remercie pour votre aide
j'ai du mal à comprendre les explications de microsoft
sur les deux messages que vous envoyez vous utilisé une foid des guillemet
d'un sens et dans l'autre des guillemets dans l'autre comme ceux ci (`dir
*.* /A:D /B`) d'ailleur que je ne sais pas faire au clavier
merci


"Do Re Mi chel La Si Do" a écrit dans le
message de news: #i2f#
Bonsoir !


Attention à la présence d'espaces dans les noms de répertoires. Par
défaut, le FOR ne va prendre que le premier mot. Par exemple le
répertoire "Mes Documents" ne retournera que "Mes". Il faut préciser
qu'on veut tous les mots en ajoutant "tokens=*".




Exact.



De plus, tu peux t'épargner l'usage du fichier temporaire en passant la
commande DIR en paramètre au lieu du fichier.




Oui, mais, comme souvent, je filtre, ça ne passe plus dans le FOR. Dans
les

cas simples, je suis d'accord. Mais perso, je préfèrerais utiliser :
for /F "usebackq tokens=*" %%i in (`dir *.* /A:D /B`) do (echo
%%i)

Mais, bon, question d'habitude.



Enfin, si ta section :TRT n'inclut qu'une seule commande, tu peux
éviter




le CALL et mettre directement la commande en fin de ligne "for ... do".




C'est vrai, mais seulement pour les commandes simples.

Autre problème du CALL interne : s'il y a un espace dans le nom du
répertoire, il faudra utiliser %* dans :TRT, faute de quoi on ne
récupèrera

que le premier mot.

Sinon, on peut aussi avoir des problèmes avec les répertoires systèmes,
les

répertoires invisibles, les noms en unicode, etc.



Globalement, on est d'accord. Mon exemple se voulait simple à comprendre.



@-salutations
--
Michel Claveau








Avatar
marc.dufresne
bonjour
apparement ce petit prog ne fonctionne pas avec des noms longs même en
utilisant "tokens" je crois quand on appel TRT on ne transmet pas toutes les
parties du nom long
merci
"Do Re Mi chel La Si Do" a écrit dans le
message de news:
Bonjour !


Le plus simple, c'est de passer par un DIR et un fichier temporaire.

Exemple :

@echo off
dir *.* /A:D /B>TEMP.TXT
for /F %%i in (TEMP.TXT) do (call :TRT %%i)
del TEMP.TXT
goto :EOF

:TRT
echo %1
goto :EOF


Dans le sous-programme :TRT on effectue les traitements

Explications, sur le DIR :
/A:D ne liste que les répertoires
/B mode "sobre", ne donne que le nom, sans fioritures
/S si l'on voulait aussi les sous-répertoires.


@-salutations

Michel Claveau





Avatar
Jacques Barathon [MS]
"marc.dufresne" wrote in message
news:%
bonjour
je vous remercie pour votre aide
j'ai du mal à comprendre les explications de microsoft
sur les deux messages que vous envoyez vous utilisé une foid des guillemet
d'un sens et dans l'autre des guillemets dans l'autre comme ceux ci (`dir
*.* /A:D /B`) d'ailleur que je ne sais pas faire au clavier
merci


Michel Claveau disait qu'il utilise plutôt le guillement inversé ` qu'on
obtient par Alt-Gr 7. Pour ma part (je suppose que c'est moi Microsoft?) je
ne l'ai pas utilisé dans mes exemples. Tu peux avoir plus d'infos sur son
usage en tapant FOR /? dans ton invite de commandes.

Jacques

Avatar
Jacques Barathon [MS]
"marc.dufresne" wrote in message
news:
bonjour
apparement ce petit prog ne fonctionne pas avec des noms longs même en
utilisant "tokens" je crois quand on appel TRT on ne transmet pas toutes
les
parties du nom long
merci


Si, toutes les parties sont transmises, mais le CALL considère l'espace
entre ces parties comme un séparateur, et les passe donc comme autant de
paramètres distincts. La preuve, le script suivant:

--- début ---
for /f "tokens=* delims=" %%d in ('dir /b doc*') do call :TRT %%d
goto :EOF

:TRT
echo 1: %1, 2: %2, 3: %3
--- fin ---

Résultat:
1: Documents, 2: and, 3: Settings

Tu as plusieurs solutions:

1. Tu peux t'amuser à reconstruire le puzzle comme je l'ai fait dans
l'exemple ci-dessus en concaténant %1, %2, etc. Gros inconvénient, il faut
savoir combien de morceaux on veut recoller.

2. Tu peux passer le paramètre entre guillemets (call :TRT "%%d"), tu
récupèreras bien la chaîne en entier à l'autre bout. Inconvénient, tu te
traîneras les guillemets dans tous les traitements suivants.

3. Tu peux ne pas passer le nom du répertoire en paramètre mais l'assigner à
une variable d'environnement que tu pourras exploiter comme bon te semble
plus loin dans ton script. Par exemple:

--- début ---
for /f "tokens=* delims=" %%d in ('dir /b doc*') do set Dir=%%d & call :TRT
goto :EOF

:TRT
echo %Dir%
--- fin ---

Résultat:
Documents and Settings

J'espère que les explications de Microsoft ont été claires ;-). Bon courage.

Jacques

Avatar
Jacques Barathon [MS]
"Jacques Barathon [MS]" wrote in message
news:
for /f "tokens=* delims=" %%d in ('dir /b doc*') do call :TRT %%d


Désolé pour le "delims=" qui n'a rien à faire là, je l'avais juste mis pour
un test et ai oublié de l'enlever avant de copier/coller. Il ne sert à rien,
même s'il ne nuit pas.

Jacques

Avatar
Do Re Mi chel La Si Do
Bonsoir !


On peut aussi utiliser, dans TRT, %* pour récupérer tous les éléments d'un
coup :

:TRT
echo %*


@+

MCI
1 2