Commandes DOS : combinaison FOR et GOTO
Résolu
Julien
-
Julien -
Julien -
A voir également:
- Commande dos for
- Invite de commande - Guide
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Commande terminal mac - Guide
- Commande dism - Guide
- Diskpart commande - Guide
11 réponses
Bonjour,
Je ne suis pas sûr de bien comprendre ton problème, à tout hasard je te joins ce qui suit.
Essaie ça, chez moi ça fonctionne (sauf le SAVE qui me sort cette anom, mais ça ne concerne pas semble-t-il le probleme qui est posé.)
'SAVE' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes.
:LOOP
IF '%1'=='' GOTO FINISH
FOR %%F IN (%1) DO (
ECHO %%F %1 passOK
ECHO LOAD %%F >> Unit.cmd
ECHO GDES >> Unit.cmd
ECHO UNIT >> Unit.cmd
ECHO EXEC >> Unit.cmd
ECHO . >> Unit.cmd )
REM SAVE %%F >> Unit.cmd )
SHIFT
GOTO LOOP
:FINISH
ECHO QUIT >> Unit.cmd
ECHO Fin du processus batch.
nom.bat 1111111 2222222 3333333
Ca me renvoie à l'écran :
1111111 1111111 passOK
2222222 2222222 passOK
3333333 3333333 passOK
Fin du processus batch.
et dans le fichier Unit.cmd : (SAVE était en commentaire)
LOAD 1111111
GDES
UNIT
EXEC
.
LOAD 2222222
GDES
UNIT
EXEC
.
LOAD 333333
GDES
UNIT
EXEC
.
QUIT
Je ne suis pas sûr de bien comprendre ton problème, à tout hasard je te joins ce qui suit.
Essaie ça, chez moi ça fonctionne (sauf le SAVE qui me sort cette anom, mais ça ne concerne pas semble-t-il le probleme qui est posé.)
'SAVE' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes.
:LOOP
IF '%1'=='' GOTO FINISH
FOR %%F IN (%1) DO (
ECHO %%F %1 passOK
ECHO LOAD %%F >> Unit.cmd
ECHO GDES >> Unit.cmd
ECHO UNIT >> Unit.cmd
ECHO EXEC >> Unit.cmd
ECHO . >> Unit.cmd )
REM SAVE %%F >> Unit.cmd )
SHIFT
GOTO LOOP
:FINISH
ECHO QUIT >> Unit.cmd
ECHO Fin du processus batch.
nom.bat 1111111 2222222 3333333
Ca me renvoie à l'écran :
1111111 1111111 passOK
2222222 2222222 passOK
3333333 3333333 passOK
Fin du processus batch.
et dans le fichier Unit.cmd : (SAVE était en commentaire)
LOAD 1111111
GDES
UNIT
EXEC
.
LOAD 2222222
GDES
UNIT
EXEC
.
LOAD 333333
GDES
UNIT
EXEC
.
QUIT
Merci Christian,
J'ai essayé, mais ça ne marche pas chez moi.
En fait, les commandes écrites dynamiquement dans le fichier Unit.cmd sont destinées à un programme acceptant les appels DOS.
Il s'agit de XFoil, un programme d'aérodynamique. Les commandes écrites ont pour but de charger l'un après l'autre des profils d'ailes (fichiers textes) situés dans un dossier. Avec UNIT, on les met à l'échelle de sorte que leur corde devient unitaire. La commande SAVE est également destinée à XFoil et sauve chaque profil, ici sous le même fichier (mode écrasement).
J'aurais donc dû écrire ECHO SAVE %%F >> Unit.cmd (J'avais oublié le ECHO.)
En fait, lorsque j'appelle ton code en passant les noms de fichiers comme arguments, j'obtiens l'erreur suivante :
DO( était inattendu.
Je ne sais pas si c'est dû à "cmd.exe" qui je crois n'est pas une véritable console DOS sous XP.
L'idée du regroupement des commandes, suggérée par DO(...) est exactement ce que je veux faire.
Sous quelle version de DOS as-tu testé?
Julien
J'ai essayé, mais ça ne marche pas chez moi.
En fait, les commandes écrites dynamiquement dans le fichier Unit.cmd sont destinées à un programme acceptant les appels DOS.
Il s'agit de XFoil, un programme d'aérodynamique. Les commandes écrites ont pour but de charger l'un après l'autre des profils d'ailes (fichiers textes) situés dans un dossier. Avec UNIT, on les met à l'échelle de sorte que leur corde devient unitaire. La commande SAVE est également destinée à XFoil et sauve chaque profil, ici sous le même fichier (mode écrasement).
J'aurais donc dû écrire ECHO SAVE %%F >> Unit.cmd (J'avais oublié le ECHO.)
En fait, lorsque j'appelle ton code en passant les noms de fichiers comme arguments, j'obtiens l'erreur suivante :
DO( était inattendu.
Je ne sais pas si c'est dû à "cmd.exe" qui je crois n'est pas une véritable console DOS sous XP.
L'idée du regroupement des commandes, suggérée par DO(...) est exactement ce que je veux faire.
Sous quelle version de DOS as-tu testé?
Julien
Bonjour,
La version de mon DOS : Microsoft Windows XP [version 5.1.2600]
Est-ce que le code tel que je te l'ai fait parvenir fonctionne chez toi ? J'ai cru comprendre que non (J'ai testé avec echo SAVE ... et bien sûr ça fonctionne chez moi)
Si ton code est différent (même très peu peux-tu m'envoyer un exemple concret, réel t (jeux d'essais succint ) afin que je le teste chez moi ?
La version de mon DOS : Microsoft Windows XP [version 5.1.2600]
Est-ce que le code tel que je te l'ai fait parvenir fonctionne chez toi ? J'ai cru comprendre que non (J'ai testé avec echo SAVE ... et bien sûr ça fonctionne chez moi)
Si ton code est différent (même très peu peux-tu m'envoyer un exemple concret, réel t (jeux d'essais succint ) afin que je le teste chez moi ?
P.S.
Attention à la syntaxe par exemple si j'écris :
FOR %%F IN (%1)
DO (
au lieu de :
FOR %%F IN (%1) DO (
ça ne fonctionne plus.
j'obtiens le message suivant :
La syntaxe de la commande est incorrecte.
Attention à la syntaxe par exemple si j'écris :
FOR %%F IN (%1)
DO (
au lieu de :
FOR %%F IN (%1) DO (
ça ne fonctionne plus.
j'obtiens le message suivant :
La syntaxe de la commande est incorrecte.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Hello Christian,
Ci-dessous, le contenu de mon fichier Unit.bat, ainsi qu'un échantillon d'un fichier passé comme argument.
L'instruction DO se trouve bien sur la même ligne que FOR.
Aucune erreur n'est générée tant que je ne spécifie pas de fichier en argument.
(Forcément, car le fichier de commande passe alors directement à la procédure :FINISH.)
Ceci ne marche pas de mon côté (OS Windows XP):
Unit.bat p/*.dat
Unit.bat p/Abrial_17.dat
où le sous-dossier "p" contient les profils (fichiers textes d'extension ".dat").
Julien
cd C:\Program Files\XFoil
CLS
@ECHO OFF
:LOOP
IF '%1'=='' GOTO FINISH
FOR %%F IN (%1) DO(
ECHO LOAD %%F >> Unit.cmd
ECHO GDES >> Unit.cmd
ECHO UNIT >> Unit.cmd
ECHO EXEC >> Unit.cmd
ECHO . >> Unit.cmd
REM ECHO SAVE %%F >> Unit.cmd
)
SHIFT
GOTO LOOP
:FINISH
ECHO QUIT >> Unit.cmd
ECHO Fin du processus batch.
REM xfoil.exe < Unit.cmd > Unit.out
REM DEL Unit.cmd
REM ECHO Le résultat des commandes se trouve dans Unit.out
Exemple de contenu de fichier texte passé comme argument de Unit.bat:
Abrial 17
1.000000 0.050000
0.992939 0.049864
0.978585 0.049592
...(etc) ...(etc)
Ci-dessous, le contenu de mon fichier Unit.bat, ainsi qu'un échantillon d'un fichier passé comme argument.
L'instruction DO se trouve bien sur la même ligne que FOR.
Aucune erreur n'est générée tant que je ne spécifie pas de fichier en argument.
(Forcément, car le fichier de commande passe alors directement à la procédure :FINISH.)
Ceci ne marche pas de mon côté (OS Windows XP):
Unit.bat p/*.dat
Unit.bat p/Abrial_17.dat
où le sous-dossier "p" contient les profils (fichiers textes d'extension ".dat").
Julien
cd C:\Program Files\XFoil
CLS
@ECHO OFF
:LOOP
IF '%1'=='' GOTO FINISH
FOR %%F IN (%1) DO(
ECHO LOAD %%F >> Unit.cmd
ECHO GDES >> Unit.cmd
ECHO UNIT >> Unit.cmd
ECHO EXEC >> Unit.cmd
ECHO . >> Unit.cmd
REM ECHO SAVE %%F >> Unit.cmd
)
SHIFT
GOTO LOOP
:FINISH
ECHO QUIT >> Unit.cmd
ECHO Fin du processus batch.
REM xfoil.exe < Unit.cmd > Unit.out
REM DEL Unit.cmd
REM ECHO Le résultat des commandes se trouve dans Unit.out
Exemple de contenu de fichier texte passé comme argument de Unit.bat:
Abrial 17
1.000000 0.050000
0.992939 0.049864
0.978585 0.049592
...(etc) ...(etc)
Bonjour,
Essaie avec un espace entre le O de DO et la parenthèse ouvrante, Je viens de les réunir DO( et j'ai le même message que toi :
DO( était inattendu
FOR %%F IN (%1) DO(
---------------------------------------------
Autrement j'ai tenté sans grand succès de résoudre le problème relatif à l'appel avec paramètres de passation %1 %2 :
Unit.bat p/*.dat
Unit.bat p/Abrial_17.dat
Je suis parvenu à extraire d'un même dossier les fichiers sur le critère de recherche "extension" avec plusieurs extensions possibles en paramètres : Unit.bat .dat .txt par exemple, mais malheureusement je récupère l'intégralité (le chemin + le nom) dans Unit.cmd exemple :
SAVE C:\Documents and Settings\Christian\Mes documents\Proc-perso\rien2.dat
de plus je ne suis pas parvenu à extraire un fichier sur son nom réel dans la même logique de traitement ex : Unit.bat p/Abrial_17.dat
J'apprends ce "langage" en ce moment et je le trouve assez galère quand même ! De plus la doc en ligne n'est pas très précise.
Bon sur ce, je vais aller dormir,
Essaie avec un espace entre le O de DO et la parenthèse ouvrante, Je viens de les réunir DO( et j'ai le même message que toi :
DO( était inattendu
FOR %%F IN (%1) DO(
---------------------------------------------
Autrement j'ai tenté sans grand succès de résoudre le problème relatif à l'appel avec paramètres de passation %1 %2 :
Unit.bat p/*.dat
Unit.bat p/Abrial_17.dat
Je suis parvenu à extraire d'un même dossier les fichiers sur le critère de recherche "extension" avec plusieurs extensions possibles en paramètres : Unit.bat .dat .txt par exemple, mais malheureusement je récupère l'intégralité (le chemin + le nom) dans Unit.cmd exemple :
SAVE C:\Documents and Settings\Christian\Mes documents\Proc-perso\rien2.dat
de plus je ne suis pas parvenu à extraire un fichier sur son nom réel dans la même logique de traitement ex : Unit.bat p/Abrial_17.dat
J'apprends ce "langage" en ce moment et je le trouve assez galère quand même ! De plus la doc en ligne n'est pas très précise.
Bon sur ce, je vais aller dormir,
Bonjour,
J'ai repris ton code à l'identique ça tourne !
:LOOP
IF '%1'=='' GOTO FINISH
FOR %%F IN (*%1) DO (
ECHO LOAD %%F >> Unit.cmd
ECHO GDES >> Unit.cmd
ECHO UNIT >> Unit.cmd
ECHO EXEC >> Unit.cmd
ECHO . >> Unit.cmd
ECHO SAVE %%F >> Unit.cmd )
SHIFT
GOTO LOOP
:FINISH
ECHO QUIT >> Unit.cmd
ECHO Fin du processus batch.
J'ai repris ton code à l'identique ça tourne !
:LOOP
IF '%1'=='' GOTO FINISH
FOR %%F IN (*%1) DO (
ECHO LOAD %%F >> Unit.cmd
ECHO GDES >> Unit.cmd
ECHO UNIT >> Unit.cmd
ECHO EXEC >> Unit.cmd
ECHO . >> Unit.cmd
ECHO SAVE %%F >> Unit.cmd )
SHIFT
GOTO LOOP
:FINISH
ECHO QUIT >> Unit.cmd
ECHO Fin du processus batch.
Bonjour,
Mille mercis. Effectivement, l'espace entre le DO et la parenthèse ouvrante a tout résolu.
Le script marche impecablement.
Je n'ai pas rencontré ton problème de chemin absolu.
Si je spécifie "p/*.dat" comme paramètre d'appel de Unit.bat, tous les fichiers en ".dat" situés dans le sous-dossier "p" sont listés sans leur chemin absolu, ni relatif. Juste leur nom.
(ECHO %%F >> Unit.cmd)
SHIFT permet d'utiliser plus de 9 arguments (%1 %2 %3 ...), qui sont à chaque invocation de SHIFT décalés en direction de %1.
Grâce à la boucle FOR, on peut accéder à des ensembles de fichiers (par exemple tous les ".dat").
Ainsi, on peut appeler Unit.bat de la manière assez sophistiquée. Exemple:
Unit.bat p/Abrial_17.dat p/*.txt q/abc*.dat
Ceci passe comme argument à Unit.bat,
- le fichier "Abrial_17.dat" du sous-dossier "p"
- tous les fichiers ".txt" du dossier "p"
- tous les fichiers ".dat" dont le nom commence par "abc" du dossier "q".
Je suis d'accord que DOS n'est pas un langage facile. Mais dans le cas qui précède, c'est diablement puissant pour traiter des milliers de fichiers avec un programme pouvant être appelé en mode DOS.
Salutations et merci encore.
Julien
Mille mercis. Effectivement, l'espace entre le DO et la parenthèse ouvrante a tout résolu.
Le script marche impecablement.
Je n'ai pas rencontré ton problème de chemin absolu.
Si je spécifie "p/*.dat" comme paramètre d'appel de Unit.bat, tous les fichiers en ".dat" situés dans le sous-dossier "p" sont listés sans leur chemin absolu, ni relatif. Juste leur nom.
(ECHO %%F >> Unit.cmd)
SHIFT permet d'utiliser plus de 9 arguments (%1 %2 %3 ...), qui sont à chaque invocation de SHIFT décalés en direction de %1.
Grâce à la boucle FOR, on peut accéder à des ensembles de fichiers (par exemple tous les ".dat").
Ainsi, on peut appeler Unit.bat de la manière assez sophistiquée. Exemple:
Unit.bat p/Abrial_17.dat p/*.txt q/abc*.dat
Ceci passe comme argument à Unit.bat,
- le fichier "Abrial_17.dat" du sous-dossier "p"
- tous les fichiers ".txt" du dossier "p"
- tous les fichiers ".dat" dont le nom commence par "abc" du dossier "q".
Je suis d'accord que DOS n'est pas un langage facile. Mais dans le cas qui précède, c'est diablement puissant pour traiter des milliers de fichiers avec un programme pouvant être appelé en mode DOS.
Salutations et merci encore.
Julien
Bonjour,
C'st vrai que c'est puissant comme langage pour ce type de traitement.
Les problèmes rencontrés étaient dû à l'utilisatiion délibérée (en vue de tester une autre méthode) de l'option /R de l'instucrtion FOR :
FOR /R [[lecteur:]chemin] %variable IN (ensemble) DO commande [paramètres]
Parcourt l'arborescence de répertoires depuis la racine [lecteur:]chemin,
en exécutant FOR dans chaque répertoire de l'arborescence. Si aucun
répertoire n'est spécifié après /R alors le répertoire en cours est
utilisé. Si ensemble est seulement un point (.) alors seule l'arborescence
de répertoires sera énumérée.
Voilà, j'ai appris quelque chose d'intéressant avec ce cas, je t'en remercie,
A bientôt peut-être pour une autre discussion,
C'st vrai que c'est puissant comme langage pour ce type de traitement.
Les problèmes rencontrés étaient dû à l'utilisatiion délibérée (en vue de tester une autre méthode) de l'option /R de l'instucrtion FOR :
FOR /R [[lecteur:]chemin] %variable IN (ensemble) DO commande [paramètres]
Parcourt l'arborescence de répertoires depuis la racine [lecteur:]chemin,
en exécutant FOR dans chaque répertoire de l'arborescence. Si aucun
répertoire n'est spécifié après /R alors le répertoire en cours est
utilisé. Si ensemble est seulement un point (.) alors seule l'arborescence
de répertoires sera énumérée.
Voilà, j'ai appris quelque chose d'intéressant avec ce cas, je t'en remercie,
A bientôt peut-être pour une autre discussion,
Merci Christian,
J'ai également appris plusieurs choses intéressantes gâce à ton aide. Tout d'abord l'instruction DO ( ), puis l'option /R et la signification du point.
Souvent, les discussions sur les forums profitent à l'un et moins à l'autre. Je suis bien content que celle-ci ait été "gagnant - gagnant".
Je ne consulte pas systématiquement le forum, mais il n'est pas exclu que j'y revienne de temps à autre.
Au plaisir de futures discussions.
Julien
J'ai également appris plusieurs choses intéressantes gâce à ton aide. Tout d'abord l'instruction DO ( ), puis l'option /R et la signification du point.
Souvent, les discussions sur les forums profitent à l'un et moins à l'autre. Je suis bien content que celle-ci ait été "gagnant - gagnant".
Je ne consulte pas systématiquement le forum, mais il n'est pas exclu que j'y revienne de temps à autre.
Au plaisir de futures discussions.
Julien
Julien,
je suis tombe sur ce site par hasard... enfin, evidemment pas tout a fait par hasard :-) par une recherche google...
j'essaie d'utiliser XFoil avec une serie de commandes stockee dans un fichier batch - exactement ce que tu sembles de faire...
Mais je n'arrive a rien - je ne sais pas quelle commande utiliser.
Depuis une fenetre DOS (j'utilise Windows XP), je tape:
xfoil Unit.cmd (pour utiliser le meme nom de fichier que toi)
mais XFoil essaie d'ouvrir le fichier Unit.cmd comme s'il sa'gissait d'un fichier de coordonnees de profil.
Comment lui faire comprendre que c'est un fichier de commandes ?
cordialement,
Paul
je suis tombe sur ce site par hasard... enfin, evidemment pas tout a fait par hasard :-) par une recherche google...
j'essaie d'utiliser XFoil avec une serie de commandes stockee dans un fichier batch - exactement ce que tu sembles de faire...
Mais je n'arrive a rien - je ne sais pas quelle commande utiliser.
Depuis une fenetre DOS (j'utilise Windows XP), je tape:
xfoil Unit.cmd (pour utiliser le meme nom de fichier que toi)
mais XFoil essaie d'ouvrir le fichier Unit.cmd comme s'il sa'gissait d'un fichier de coordonnees de profil.
Comment lui faire comprendre que c'est un fichier de commandes ?
cordialement,
Paul
Bonjour Paul,
Il faut insérer un "<" entre l'appel de xfoil et le fichier de commandes.
Exemple:
xfoil.exe < Unit.cmd > Unit.out
Ici, Unit.out est un fichier de sortie vers lequel les résultats de xfoil sont redirigés.
Il pourrait tout aussi bien s'appeler Unites.txt.
Sinon, le fichier Unit.cmd a un contenu qui ressemble à ceci :
LOAD 12A_9,00%.dat
GDES
UNIT
EXEC
.
SAVE 12A_9,00%.dat
LOAD _2032C.dat
GDES
UNIT
EXEC
.
SAVE _2032C.dat
Ci-dessus, l'exemple est pour 2 profils. Je génère automatiquement le fichier de commandes xfoil à partir d'un fichier batch (.bat).
Si ça vous intéresse, j'ai mis récemment en ligne la documentation de Lixfoil qui est un ensemble de fichiers de commandes et de fonctions pour appeler XFOIL en batch.
http://www.sitemakers.ch/doc/lixfoil/en/index.htm
Cordialement.
Julien
Il faut insérer un "<" entre l'appel de xfoil et le fichier de commandes.
Exemple:
xfoil.exe < Unit.cmd > Unit.out
Ici, Unit.out est un fichier de sortie vers lequel les résultats de xfoil sont redirigés.
Il pourrait tout aussi bien s'appeler Unites.txt.
Sinon, le fichier Unit.cmd a un contenu qui ressemble à ceci :
LOAD 12A_9,00%.dat
GDES
UNIT
EXEC
.
SAVE 12A_9,00%.dat
LOAD _2032C.dat
GDES
UNIT
EXEC
.
SAVE _2032C.dat
Ci-dessus, l'exemple est pour 2 profils. Je génère automatiquement le fichier de commandes xfoil à partir d'un fichier batch (.bat).
Si ça vous intéresse, j'ai mis récemment en ligne la documentation de Lixfoil qui est un ensemble de fichiers de commandes et de fonctions pour appeler XFOIL en batch.
http://www.sitemakers.ch/doc/lixfoil/en/index.htm
Cordialement.
Julien