[batch DOS] boucles FOR imbriquées

boucles FOR imbriquées [batch DOS] - Shell/Batch - Programmation

Marsh Posté le 26-06-2006 à 12:22:41    

Après moults tests infructueux à essayer d'imbriquer plusieurs FOR dans un batch sous DOS, en faisant bien gaffe aux paramètres, je suis en train de me demander si c'était possible en fait?
 
Autre question pour ma culturation personnelle: y'a-t-il une limite de caractère à une ligne de batch?
 
:jap:


---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 26-06-2006 à 12:22:41   

Reply

Marsh Posté le 26-06-2006 à 12:43:32    

il paraitrait que les batch dos c'est la préhistoire et que depuis il y a le VB Script (fichier .vbs et double click)
 
en tout cas j'ai lu ça au moins 50 fois sur ce forum! :)

Reply

Marsh Posté le 26-06-2006 à 12:43:42    

Oui, c'est possible de les imbriquer.
 
Maintenant, tes erreurs pourraient être dues à autres choses.
 
Poste ton script + résumé du problème.

Reply

Marsh Posté le 26-06-2006 à 15:54:49    

wackevat a écrit :

Oui, c'est possible de les imbriquer.
 
Maintenant, tes erreurs pourraient être dues à autres choses.
 
Poste ton script + résumé du problème.


Dans l'urgence, j'ai dû faire autrement et ai donc effacé tous les essais/tests, mais c'était de ce genre là:
 

Code :
  1. FOR /F "tokens=1,2,3,4,5,6,7,8 delims=;" %%A IN (%~1) DO (FOR /F "tokens=1,2,3 delims=;" %%M IN (%~2) DO (ECHO %%A %%N >> toto.txt))


Problème: j'ai jamais rien eu dans toto.txt, et pourtant il y a ce qu'il faut dans les 2 fichiers en entrée...
 
Me fourvoie-je dans la compréhension du FOR?
 
subtil >> c'est déjà suffisamment le bordel dans l'application en question(appel php/batch/VB) pour que j'évite un autre type d'appel :d


---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 26-06-2006 à 16:53:12    

Déjà tu peux écrire ta boucle de cette façon :

Code :
  1. for /f "tokens=1 delims=;" %%a in (%~1) do (
  2.   for /f "tokens=2 delims=;" %%n in (%~2) do (
  3.     echo a=---%%a---
  4.     echo n=---%%n---
  5.   )
  6. )
  7. pause


pour voir ce que ça affiche.
 
Est-ce qu'il y a des espaces dans %~1 et %~2 ?

Reply

Marsh Posté le 26-06-2006 à 17:36:28    

Ben mairdalors, ça marche [:le kneu]
 
Je comprend pas, j'ai dû tester comme une ouiche :d
Merci en tout cas :jap:


Message édité par En_Sabah_Nur le 26-06-2006 à 17:38:03

---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 28-06-2006 à 19:40:06    

Question: on ne peut pas déclarer une variable dans une boucle for?
 
Genre

Code :
  1. FOR /F "skip=3 tokens=1,2,3,4,5,6 delims=;" %%A IN (test.txt) DO (
  2. SET toto=123
  3. )
  4. ECHO %toto%


l'echo ne renvoit rien...C'est normal? :heink:


Message édité par En_Sabah_Nur le 03-07-2006 à 13:33:25

---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 28-06-2006 à 19:50:31    

Tu as encore testé "comme une ouiche" même si je ne sais pas ce que c'est :D
 
Sinon, toujours aussi moche ta façon de récupérer les tokens :o

Reply

Marsh Posté le 29-06-2006 à 10:14:21    

wackevat a écrit :

Tu as encore testé "comme une ouiche" même si je ne sais pas ce que c'est :D
 
Sinon, toujours aussi moche ta façon de récupérer les tokens :o


Une ouiche lorraine >> Le grand détournement :jap:
 
Moche? Pourquoi?
 
Et donc, tu affirmes à 100% que SET dans un FOR (même imbriqué?) marche correctement? (à savoir la variable en question est disponible hors de la boucle FOR)
L'exemple que je t'ai donné marche chez toi?


---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 29-06-2006 à 15:34:28    

Trouvé!
 
Donc effectivement, ça marche pas, il faut spécifier l'utilisation des Delayed Expansion (?) avec ça:
SETLOCAL ENABLEDELAYEDEXPANSION
 
Alleluia! [:______ from ppc]


---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 29-06-2006 à 15:34:28   

Reply

Marsh Posté le 29-06-2006 à 22:55:34    

Oui, ça s'appelle l'expansion retardée des variables d'environement ;)
 
A noter que cette option n'est pas toujours très "confortable" d'usage. Perso je préfère l'appel des procédures, cf. ce topic où j'ai donné un exemple :
http://forum.hardware.fr/hardwaref [...] 2792-1.htm
 
Sinon, ma remarque sur la mocheté :D concerne l'énumération des tokens :
tokens=1,2,3,4,5,6
 
Si tu as besoin de tous les 6 :
tokens=1-6
 
si seulement les 2, 3, 4 et 6è par exemple :
tokens=2-4,6
 
Cf. ma réponse du 26-06-2006 à 16:53.

Reply

Marsh Posté le 03-07-2006 à 12:53:54    

D'accord, je comprend...
Par contre, c'est plus explicite avec la méthode sale :D
 
Nouvelle question: l'ordre des paramètres tokens a-t-il une importance?
 

Code :
  1. FOR /F "skip=3 tokens=6,2,5,3,1,2 delims=;" %%A IN (test.txt) DO (echo toto)


me renverra-t-il les données dans les variables %%A, %%B, etc... suivant cet ordre?
A savoir cette correspondance:
6 --> %%A
2 --> %%B
5 --> %%C
etc...
 
J'ai bien peur que non, et ça m'embête fortement...


Message édité par En_Sabah_Nur le 03-07-2006 à 13:32:58

---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 03-07-2006 à 12:59:35    

Euh, il suffit de tester avec la commande
echo
hein ? :D

Reply

Marsh Posté le 03-07-2006 à 13:05:15    

Certes, mais visiblement, je suis pas très doué pour tester, y'a qu'à voir ce topic :D
 
Bref, perso, ça correspond pas et j'aurais voulu une confirmation...


---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 03-07-2006 à 13:31:37    

Encore plus embêtant: il saute carrément les champs vides [:le kneu]
 
Si mon fichier contient "champ1;champ2;;champ4"
 

Code :
  1. FOR /F "tokens=1,2,3,4 delims=;" %%A IN (test.txt) DO (echo valeurs = %%A ** %%B ** %%C ** %%D)


il me retourne
valeurs = champ1 ** champ2 ** champ4 **
 
 [:iznogoud_23]

Message cité 1 fois
Message édité par En_Sabah_Nur le 03-07-2006 à 13:32:45

---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 03-07-2006 à 13:53:16    

En_Sabah_Nur a écrit :

Encore plus embêtant: il saute carrément les champs vides [:le kneu]


C'est par définition :D
 
Vois l'aide de  
for
pour plus de précisions.

Reply

Marsh Posté le 04-07-2006 à 09:52:04    

Une dernière question: il me faut insérer != dans une chaîne, seulement, ça marche pas même en entourant de guillemets et en échappant avec ^
 

Code :
  1. SET toto="^!="
  2. ECHO toto > toto.txt


renvoit "!="
 
Comment je peux faire?
 
edit: je précise que sans guillemets, j'obtiens seulement le signe = ...


Message édité par En_Sabah_Nur le 04-07-2006 à 10:03:01

---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 04-07-2006 à 11:56:57    

Code :
  1. set toto=^!^=
  2. echo %toto%>toto.txt


:D

Reply

Marsh Posté le 04-07-2006 à 14:29:25    

wackevat a écrit :

Code :
  1. set toto=^!^=
  2. echo %toto%>toto.txt


:D


Merci :jap:
 
Ça marche bien en test comme ça, mais c'est plus le cas une fois inclut dans mon batch :heink: (seul le = apparait)
J'utilise l'expansion retardée, du coup, le signe ! est peut-être bloqué?


---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 04-07-2006 à 14:39:23    

Ouais.
 
Revois mon message du 29-06-2006 à 22:55 :D

Reply

Marsh Posté le 04-07-2006 à 14:50:16    

Ah ouais! Bon ben je m'y colle [:iznogoud_23]  
 
Encore merci :jap:


---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 05-07-2006 à 10:19:31    

Nouvelle question:
 
je voudrais récupérer le résultat d'une commande directement dans une variable, comment je fais? ACtuellement, je passe dans un fichier temporaire, mais c'est beaucoup trop lent du coup...
 
Comme ça:

Code :
  1. cat %FIC_TMP% | gawk -F; "{print $2 }" > %FIC_TMP2%
  2.     SET /P COLUMN_A=<%FIC_TMP2%


L'objectif est de directement avoir le résultat du cat/gawk dans la variable COLUMN_A
 
C'est possible? (mes recherches sur le net ont été vaines)


Message édité par En_Sabah_Nur le 05-07-2006 à 10:32:21

---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le 05-07-2006 à 12:56:04    

J'ai trouvé un truc qui semble marcher:

Code :
  1. @ECHO OFF
  2. SET FIC_TMP=test.csv
  3. for /f %%a in ('call _commande.bat "%FIC_TMP%"') do (
  4.     set variable=%%a
  5.     echo %%a
  6. )
  7. echo Last line : %variable%


avec dans _commande.bat:

Code :
  1. cat %~1 | gawk -F; "{print $0 }"


---------------
XBL : ESN3S | GGPO (3rd strike) : ESN | PSN : Huitxilopochti
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed