Rechercher : dans
Par :

[Batch], FOR ???

Dernière réponse le 13 mai 2009 à 20:19:17 H4RDW4RE, le 25 nov 2008 à 21:32:49 
 Signaler ce message aux modérateurs

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

@+
Configuration: Windows Vista
Opera 9.62

Meilleures réponses pour « [Batch], FOR ??? » dans :
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
PhpMyAdmin - 1045- Access denied for user root@localhost VoirPhpMyAdmin - Access denied for user root’@localhost Cette astuce est destinée à ceux qui ont un problème d’ouverture de PhpMyAdmin (par exemple avec WAMP Server ou EasyPHP) avec l'erreur suivante : #1045- Access denied for user...
Sauvegarde incrémentielle de données avec un .bat (Batch) VoirPourquoi utiliser la sauvegarde incrémentielle ? Sauvegarder vos données importantes avant un formatage par exemple... Au 1er lancement du batch, il sauvegarde l'intégralité des dossiers et fichiers, par contre si vous relancez le batch 2 semaines...
Télécharger NTFS for Mac OS X VoirAccès total en lecture et en écriture vers des volumes NTFS NTFS for Mac® OS X fournit un accès total (lecture ou écriture, formatage) vers des partitions NTFS. Compatible avec toutes les versions de NTFS Toutes les versions NTFS sont prises en...
EDGE (Enhanced Data Rates for GSM Evolution) VoirIntroduction au standard EDGE Le standard EDGE (Enhanced Data Rates for GSM Evolution.) est une évolution de la norme GSM, modifiant le type de modulation. Tout comme la norme GPRS, le standard EDGE est utilisé comme transition vers la troisième...

1

cchristian, le 26 nov 2008 à 01:06:49

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
Cordialement.

Cchristian.

Répondre à cchristian

2

H4RDW4RE, le 26 nov 2008 à 16:37:28

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

@+

Répondre à H4RDW4RE

3

cchristian, le 26 nov 2008 à 18:37:52

Bonsoir,

http://windows.developpez.com/... Cordialement.

Cchristian.

Répondre à cchristian

4

H4RDW4RE, le 26 nov 2008 à 19:52:50

Ok, merci Cchristian

@+

Répondre à H4RDW4RE

5

cchristian, le 26 nov 2008 à 22:44:08

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. Cordialement.

Cchristian.

Répondre à cchristian

6

cchristian, le 27 nov 2008 à 01:40:11

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 ..........
Cordialement.

Cchristian.

Répondre à cchristian

7

H4RDW4RE, le 27 nov 2008 à 19:37:00

Ouaaaaa

Merci beaucoup Cchristian !!!

C'est très gentil a toi^^

Encore merci

@+

Répondre à H4RDW4RE

8

cchristian, le 27 nov 2008 à 20:03:46

Bonsoir,

Bon courage pour la suite, si tu as des questions n'hésite pas. Cordialement.

Cchristian.

Répondre à cchristian

9

ryaxx, le 13 mai 2009 à 10:57:59

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

Répondre à ryaxx

10

cs-bilou, le 13 mai 2009 à 16:48:06

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 Il y a des jours faut pas m'chercher.
Et y'a des jours tous les jours !

Répondre à cs-bilou

11

 ryaxx, le 13 mai 2009 à 20:19:17

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

Répondre à ryaxx
Collection CommentÇaMarche.net