[Batch], FOR ??? [Résolu/Fermé]

Signaler
-
 ryaxx -
Bonjour à tous.
Voila, je débute en programmation de fichier Batch et j'ai quelques soucis avec la commande FOR

1er pb :

Pourquoi je ne peut pas mettre de variable dans un ensemble for ??

Exemple :

@echo off
@cls
set /p VAR=C:\Users\%USERNAME%\Desktop
cd C:\Windows
REM J'ouvre un autre dossier pour ne plus être dans le même emplacement, pour que la variable serve a quelque chose...
for %%A in (%VAR%\*.bat %VAR%\*.zip) do dir %%A
pause>nul
REM Se code ne marche pas !!!!


Autre code :

@echo off
@cls
REM Pas besoin de mettre "cd C:\Users\%USERNAME%\Desktop" car c'est l'emplacement du batch
for %%A in (*.bat *.zip) do dir %%A
pause>nul
REM Se code marche !!!!




2ème "pb" :

Bon déjà, je rame completement avec la commande FOR toute seul, mais pouvez vous quand même m'expliquer les "fonctions" TOKENS et DELIMS (je voit a peu près a quoi sa sert, mais je n'arrive pas trop a les manier...)
Alors une explication simple et complette est la bievenue^^



Voila, j'ai fini =D

Merci d'avance

@+

6 réponses

Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
125
Bonsoir,

En ce qui concerne le premier problème essaie en mettant entre double quotes ta variable VAR :

for %%A in ("%VAR%"\*.bat "%VAR%"\*.zip) do echo %%A

Merci beaucoup Cchristian, sa marche !!!

Quelqu'un connait un bon tuto sur la commande FOR accompagnée de TOKENS et DELIMS ou bien m'expliquer car je ne comprend pas beaucoup... J'en ai déjà lut des dizaines mais je suis toujours aussi en retard...

Merci d'avance

@+
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
125

Ok, merci Cchristian

@+
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
125
Bonsoir H4RDW4RE,

Je vais essayer de trouver du temps pour te faire un topo sur la boucle FOR, ça ne pourra se faire dans le meilleur des cas que demain, en effet, en ce moment je rencontre quelques problèmes qui mobiisent tout mon temps libre.
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
125
Bonsoir,

Allez, j'ai un peu de courage, allons-y !
-----------------------------------------------------------------------
A titre d'illustration, voici une serie de 3 boucles FOR dont 2 imbriquées :
rem   - BOUCLE PRINCIPALE de lectures des chemins d'accès complets.
rem   - EXTRACTION (chemin accès) du nom et de l'extension du fichier en cours.
rem   - RECHERCHE dans ce fichier en cours de la présence de une ou plusieurs
rem       occurrences de chaque MOT/CRITERE présent dans le fichier nomF_CH.

        FOR         /R   "%param_1%"               %%F IN  (*.%ext%)        DO (
           SET      /A   "nb_fichiers_accedes+=1"
           SET      /A   "cpt_mots_trouves=0"
           SET           "nom_ext=%%~nxF"
           FOR      /F   "eol={ tokens=1* delims=" %%J IN  (%nomF_CH%)   DO (
              FOR   /F   "tokens=1* delims="       %%K IN  (
                         ' TYPE "%%F"  ^| FIND /I "%%J" '  )         DO (
                SET /A   "cpt_mots_trouves+=1"
                SET      "nom_lib_rech=%%J"
                CALL     :CRE_FICH_MATCH
                CALL     :ECRITURE_MATCH          "%%F"     !nom_ext!    )  )  )


TOKEN  (help for sous l'invite de commande)
 tokens=x,y,m-n  - spécifie les parties de chaque ligne devant être
                   transmises au corps de FOR à chaque itération.
                   Ceci provoquera l'allocation de noms de variables
                   supplémentaires. La forme m-n est une étendue
                   spécifiant les parties allant de m à n. Si le
                   dernier caractère de la chaîne tokens= est une
                   astérisque, alors une variable supplémentaire est
                   allouée et reçoit le texte restant dans la ligne
                   suivant la dernière partie analysée.
EX:            FOR      /F   "eol={ tokens=1* delims=" %%J IN  (%nomF_CH%)   DO (..
eol={ : Je demande à ce que les lignes présentes dans le fichier %nomF_CH% et commençant par un "{" soient ignorées par le traitement de cette boucle for.
ex du contenu du fichier %nomF_CH :
{palindrome
{...............
{malloc
strtol
seule la ligne contenant la chaine de caractères "strtol" est traitée dans le corps de la boucle FOR.

token : Détermine le nombre de parties de la ligne ; c’est-à-dire 1 à n groupes au maximum de caractères contigus, groupes séparés (et donc identifiés) par un ou plusieurs délimiteurs pris par défaut (espace et tabulation si delims= n'est pas codé ) ou définis dans le paramètre delims=dd.

Le premier ou le seul groupe de caractères sélectionné se trouve dans la variable explicitement définie (ici %%J).
Au-delà de 1 groupe (token=1,2 par exemple) une ou plusieurs variables supplémentaires sont automatiquement générées. Le nom de chaque variable supplémentaire est constitué de la lettre, ( précédée de 2 signes "%"), qui, dans l’alphabet, suit immédiatement la lettre attribuée à la dénomination de la variable précédente, ou de la variable explicitement définie, ici %%J (ex; %%J, %%K, %%L,......). Chacune d'elle(s) est renseignée, le cas échéans, avec le groupe correspondant. (avec token=1,2 il y a 2 variables possibles %%J et %%K).EX:
 FOR  /F "eol={ tokens=1,2 delims=" %%J IN (%nomF_CH%) DO (ECHO J: %%J   K: %%K) 
{palindrome
{...............
{malloc
strtol a traiter
Dans cet exemple, token considère 2 groupes possibles (2 parties de ligne non délimités puisque delims=" rien.
La commande ECHO %%J %%K affiche : J: strtol a traiter K: texte présent uniquement dans la variable %%J car aucun délimiteur n'est actif.
Si maintenant je retire delims= ce sont les délimiteurs par défaut qui vont être actifs (dont l'espace) :
 FOR  /F   "eol={ tokens=1,2"   %%J  IN  (%nomF_CH%)   DO ( ECHO J: %%J    K: %%K) 
On obtient J: strtol K: a
Si je souhaite maintenant récupérer le reliquat de la ligne je fait suivre le second paramètre de token= par un astérisque (*) une nouvelle variable est créée (ici %%L) :
 FOR  /F "eol={ tokens=1,2*" %%J IN (%nomF_CH%) DO ( ECHO J: %%J   K: %%K  L: %%L) 
On obtient J: strtol K: a L: traiter

Dans l'exemple initial token=1* : Je demande à ce que les groupes de caractères (l'ensemble de la ligne) n'2tant subordonnés à aucun critère de sélection delims= soient contenus dans la variable %%J.
A noter que l'astérisque est ici inopérante, token=1 est suffisant.

Voilà nécessairement résumés par quelques exemples des cas d'utilisation des paramètres de la boucle FOR, il y a bien entendu d'autres combinaisons possibles, je te laisse les découvrir par l'exemple ..........

Ouaaaaa

Merci beaucoup Cchristian !!!

C'est très gentil a toi^^

Encore merci

@+
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012
125
Bonsoir,

Bon courage pour la suite, si tu as des questions n'hésite pas.
>
Messages postés
921
Date d'inscription
lundi 21 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2012

nickel merci !!!!
Par contre j'ai une petite question, j'aimerais effectuer un calcul de colonne d'un fichier plat
exemple dans mon fichier j'ai :
56 45 75
34 63 67
23 43 98
donc avec ma boucle for j'ai
FOR /f "tokens=2 delims= " %%A in (fichie.txt) do echo %%A
j'obtient bien (les valeurs de la variable %%A)
45
63
43
sauf que j'aimerais faire l'addition de cette colonne si x chiffre afin de trouver le résultat
comment je p donc procédé ?, y a t'il moyen de l'intégré directement dans la boucle for ?

je dois avouer que c'est super intérrésant
Messages postés
769
Date d'inscription
dimanche 2 décembre 2007
Statut
Membre
Dernière intervention
24 février 2011
166
Tien un petit truc que j'avais fait pour moi.
Si sa peut t'aider.

Delims=. est le séparateur des champs. Donc les partie seront avant et après le ou les point.
token=2 on affiche que la deuxième partie étant "admin" et "user"
                       la premier étant "1" et "2"

Exemple 1:
for /F "tokens=2 delims=." %%i in ('type text.txt') do echo %%i

text.txt:

Séparateur 
 |
 |
 v
1.admin
2.user1
A    A
|    |
|    |
|  Deuxieme partie
|
|
|
Premier partie

Vu que le séparateur (delims=.) est un point.
Si tokens=1 Sa n'affichera juste la premier partie donc "1" et "2".
Si tokens=2 sa n'affichera juste la deuxieme donc "admin" et "user1"..



Bilou
je vais tester ça de suite

sinon sur un autre forum j'ai trouver une autre solution qui fonctionne nickel (je vous fait tourné l'info)
SETLOCAL ENABLEDELAYEDEXPANSION
SET Total=0
for /f "tokens=10 delims= " %%a in (test.txt) do (set /a Total=!Total!+%%a)
echo Total : !Total!
pause

et ça le fait bien
Merci bilou