Se connecter avec
S'enregistrer | Connectez-vous

batch gestion de fichier ......

Dernière réponse : dans Programmation

Bonsoir à tous bon voila mon ou plustot MES problèmes :

question n°1 : Comment récupéré la première ligne d'un fichier dans une variables.

question n°2 : Comment conter le nombre de lignes d'un fichier ??

question n°3 : Comment avec une liste de nom créer à l'avance mon fichier batch copie un fichier mais avec les différents nom qui se trouvent dans la liste. (Vous voyez ce que je veu dire ?)

question n°4 : Bon alors esqu'il est possible de faire quelque chose du genre :

echo <123.txt >321.txt ??

Sachant que cet exemple ne marche pas ! J'ai essayer aussi de récupérer le contenue du fichier dans une variable :

set /P contenue=<123.txt
echo %contenue%>321.txt


Mais sa non plus n' a pas marché.
Et quand on utilise la fonction ">>" sa écris dans un fichier sans modifié le contenue qu'il y avait avant mais est il possible au lieu que sa rajoute à la suite sa rajoute au début du fichier ?

Je pense que ces questions il n y a pas que moi qui me les poses, si quelqu'un pouvait m'aider please .... sa va faire peut être 2 semaines que je cherches sans rien trouver :'( 

Merci !

Autres pages sur : batch gestion fichier

Lassé par la pub ? Créez un compte
Expert Programmation

Disclamer: mes solutions sont peut-être barbare mais de toute facon c'est l'ésprit du batch, du moins celui qui tourne sous ms-dos, w9x et au dessus

Citation :
question n°1 : Comment récupéré la première ligne d'un fichier dans une variables.

réponse simple : avoir un fichier contenant 'nomdubatch --unargumentquel'ontesteracarilestimportant, faire une concaténation binaire de ce fichier et du fichier que tu veux et lancer cet autre fichier comme un batch :
  1. @echo off
  2. if "%1"=="--unargumentquel'ontesteacarilestimportant" goto suite
  3.  
  4. :: un programme ...
  5.  
  6. :: recuperation de la premiere ligne du fichier
  7. copy /b entete.txt+fichier.txt getligne.bat /b
  8. :: remarquez que je n'utilise surtout pas call
  9. getligne.bat
  10. :suite
  11. shift
  12. ::la ligne que l'on veut est dans les paramettres, ou bien on l'utilise, ou bien euh ...
  13.  
  14. :getparam
  15. set arg=%arg%%1 >nul
  16. shift
  17. if not "%1"=="" goto getparam
  18. :: la les paramettres sont dans arg, mais on pert pas mal quand même ...

Citation :
question n°2 : Comment conter le nombre de lignes d'un fichier ??
trouver un executable unix pour windows qui s'appelle ''wc'' et lire son manuel, c'est le seul moyen potable
Citation :
question n°3 : Comment avec une liste de nom créer à l'avance mon fichier batch copie un fichier mais avec les différents nom qui se trouvent dans la liste. (Vous voyez ce que je veu dire ?)

la encore une solution barbare que je ne detaille pas trop car je sait que ça se fait mieux dans certains windows recent, mais basiquement le truc est que quand on éxecute des commandes du type copy /b fichier.txt con /b la dernière ligne contient par exemple :
''ceci est la derniere ligne du fichier1 fichier(s) copié(s) avec succès''
on peut ensuite faire un find sur ''1 fichier(s) copié(s) avec succès'', lire cette chaine, faire un find -v sur ''1 fichier(s) copié(s) avec succès'' et recommencer jusqu'a que le fichier soit vide
Citation :
question n°4 : Bon alors esqu'il est possible de faire quelque chose du genre :

echo <123.txt >321.txt ??
déjà je comprend pas ce que tu veut faire, basiquement ''commande < fichier.txt'' envoie le contenu de fichier.txt sur l'entrée standart, c'est à dire que ça va faire comme si l'utilisateur tapait le contenu du fichier au clavier

echo n'attend rien au clavier, donc il ignore le contenu de 123.txt

pour afficher le contenu d'un fichier on peut utiliser type fichier.txt
Citation :
Et quand on utilise la fonction ">>" sa écris dans un fichier sans modifié le contenue qu'il y avait avant mais est il possible au lieu que sa rajoute à la suite sa rajoute au début du fichier ?
simple :
  1. commande > "fichiertemporaire.txt"
  2. copy /a "fichiertemporaire.txt"+"123.txt" "fichierfinal.txt"
  3. :: et si on veut :
  4. copy "fichierfinal.txt" "123.txt"
Expert Programmation

Le MS-DOS manque cruellement de telles fonctions tout en donnant une fausse impression de facilités. D'où ce genre de post.

Habitué à plus de confort sur d'autres systèmes, j'installe systématiquement CygWIN www.cygwin.com sur les postes avec lesquels je dois bosser.

Si tu n'as pas la possibilité ou la volonté d'installer CygWIN, tu peux toujours voir du côté de UnxUtils http://unxutils.sourceforge.net. Tu y trouveras entre autres wc évoqué par Batchy.

Enjoy!

C'est vrai que moi j'utilise le batch car comme tu dis c'est facile et je trouve qu'on perd beaucoup moin son temps !! aulieu de faire une page de code en C++ pour copier un fichier on fé juste :

copy fichier1 destination

C'est pour sa que j'ai choisi le batch !! Mais si tu connais un langage plus puissant que tu me conseillerais . . . .

Merci
Expert Programmation

Batch c'est très bien pour ce que tu as à faire.
Mais il manque des tas de fonctions au DOS.

unxutils apporte les fonctions UNXI classiques.
C'est 99.9% des besoins.

Mais s'il t'en manque encore, tu peux toujours programmer un filtre en C. Voici un canevas de fonction qui fait RIEN :

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #define BUFSIZE 4097
  6.  
  7. int main ( int argc, char * argv [ ] )
  8. {
  9. char buf [ BUFSIZE ];
  10.  
  11. if ( argc == 2 && ! strcmp ( argv [ 1 ], "--version" ) )
  12. {
  13. fprintf ( stderr, "NOM_DE_LA_FONCTION - (copyleft)ton_nom_ici 2005\n" );
  14. return 1;
  15. }
  16.  
  17. if ( argc == 2 && ! strcmp ( argv [ 1 ], "--help" ) )
  18. {
  19. fprintf ( stderr, "Usage: NOM_DE_LA_FONCTION [options] [file_ref] \n" );
  20. return 1;
  21. }
  22.  
  23. /* Traitement des paramètres, .. ou pas */
  24.  
  25. while ( fgets ( buf, BUFSIZE - 1, stdin ) ) /* stdin ou autre, selon les paramètres */
  26. {
  27. /* traitement direct sur le buf, .. ou pas */
  28. printf ( "%s", buf );
  29. }
  30.  
  31. return 0;
  32. }


En revanche, CygWIN c'est un environnement de type UNIX complet !

Enjoy!

Zeb dsl mais je comprend pas du tout ce que tu vien de me dire !!

batchy : je comprend pas ton script pour récuperer la 1er ligne .... :|
je comprend pas trop la partie ou tu fé intervenir un second fichier batch .... et je vois que tu utilise une commande "shift" à la ligne n° 16 mais à quoi set cette commande ?

Kang0L ouai bon si c'est pour faire des remarques du genre non merci !! C'est bon google je le connais très bien ce que je cherche c'est une reponse clair pas les truc indigeste dans les site qui sont copié du "shift/?" tappé dans dos !

Moi je suis sous XP fam. Et voila ce que m'affiche le "shift/?"

Shift change la position de paramètres remplaçables dans un programme de commandes.

SHIFT [/n]

Si les extensions de commandes sont activées, la commande SHIFT prend en charge le commutateur entre 0 et 8. Par exemple :

SHIFT /2

décalerait %3 en %2, 4% en %3, etc. et laisserait %0 et %1 intacts.


Bon je sais pas pour vous mais pour moi tout sa sa ne veu tout simplement rien dire .....

c'est pourtant tres clair :o 

  1. @echo off
  2. echo %%1 = %1
  3. echo %%2 = %2
  4.  
  5. shift
  6. echo.
  7. echo %%1 = %1
  8. echo %%2 = %2
  9.  
  10. shift
  11. echo.
  12. echo %%1 = %1
  13. echo %%2 = %2


C:\Documents and Settings\KangOl\Bureau>test_shift.bat a b c d e
%1 = a
%2 = b

%1 = b
%2 = c

%1 = c
%2 = d

C:\Documents and Settings\KangOl\Bureau>

bon pour faire simple, soit un batch nommé script1.bat, appelé de la façon suivante :
  1. batch1 arg1 arg2 arg3


dans %0 tu as batch1, dans %1, arg1, dans %2 arg2, et dans %3, arg.

Si ton batch doit vérifier la ligne de commande, tu vas sans doute vouloir vérifier la valeur de %1, %2, %3, etc. et %0 on s'en fiche (sauf pour afficher un message d'erreur ou d'usage approprié).

Dans ce cas, comme on se fiche de %0, on vérifie d'abord %1, puis on fait un "shift /1". Dans ce cas, on a :
%0 = batch1, %1 = arg2, %2 = arg3, %3 non défini.
on fait de même pour le traitement de arg2 et arg3. Dans tout le fichier de commandes, %0 reste inchangé et vaut le nom du fichier de commandes

exemple de batch pour montrer l'intérêt :
  1. @echo off
  2.  
  3. if %1x == x (
  4. echo %0 pas d'argument
  5. goto end
  6. ) else (
  7. echo %0 arg1 = %1
  8. )
  9.  
  10. shift /1
  11.  
  12. if %1x == x (
  13. echo %0 1 seul argument
  14. goto end
  15. ) else (
  16. echo %0 arg2 = %1
  17. )
  18.  
  19. shift /1
  20.  
  21. if %1x == x (
  22. echo %0 2 arguments
  23. goto end
  24. ) else (
  25. echo %0 arg3 = %1
  26. )
  27.  
  28. shift /1
  29.  
  30. if %1x == x (
  31. echo %0 3 arguments
  32. ) else (
  33. echo %0 plus de 3 arguments
  34. )
  35.  
  36. :end



Edit : zut, alors que je faisais mon batch, KangOl a expliqué :) 
Expert Programmation

Citation :
c'est pourtant tres clair :o 

ça ça l'est encore plus :
Citation :
------------------------- MS-DOS v6.22 Help: Shift -------------------------
<Notes> <Examples> <Index>
----------------------------------------------------------------------------

SHIFT

Changes the position of replaceable parameters in a batch program.

Syntax

SHIFT

***

<Syntax> <Examples>
----------------------------------------------------------------------------

SHIFT--Notes

How the SHIFT command works

The SHIFT command changes the values of the replaceable parameters %0
through %9 by copying each parameter into the previous one. In other words,
the value of %1 is copied to %0, the value of %2 is copied to %1, and so on.
This is useful for writing a batch file that performs the same operation on
any number of parameters.

Working with more than 10 command-line parameters

You can also use the SHIFT command to create a batch file that can accept
more than 10 parameters. If you specify more than 10 parameters on the
command line, those that appear after the tenth (%9) will be shifted one at
a time into %9.

Shifting parameters back

There is no backward SHIFT command. Once you carry out the SHIFT command,
you cannot recover the first parameter (%0) that existed before the shift.

***

<Syntax> <Notes>
----------------------------------------------------------------------------

SHIFT--Example

The following batch file, MYCOPY.BAT, shows how to use the SHIFT command
with any number of parameters. It copies a list of files to a specific
directory. The parameters are the directory name followed by any number of
filenames.

@echo off
rem MYCOPY.BAT copies any number of files
rem to a directory.
rem The command uses the following syntax:
rem mycopy dir file1 file2 ...
set todir=%1
:getfile
shift
if "%1"=="" goto end
copy %1 %todir%
goto getfile
:end
set todir=
echo All done

***

----------------------------------------------------------------------------


sanglier08 a dit :
tout à fait, mais faut avoir envie de faire des batch qui prennent plus de 9 paramètres !! :pt1cable: 

dans mon exemple j'ai tout simplement mit la première ligne du fichier en paramettre, donc forcement j'ai besoin de recuperer toute la ligne, pas seulement les 9 premier mots...

batchy tu m'a di que pour récupeerer la première ligne d'un fichier dans uen variable il fallait faire : je cite

Citation :
avoir un fichier contenant 'nomdubatch --unargumentquel'ontesteracarilestimportant, faire une concaténation binaire de ce fichier et du fichier que tu veux et lancer cet autre fichier comme un batch


Mais es tu sur d'avoir bien compris pas question ?? je veu juste que la 1er ligne d'un fichier la plus part du temp ce sera un fichier texte et bien je la copie dans un autre fichier ou si non je la met dans une variable.

Exemple : mon fichier1.txt dedans il y a ceci :

- Bonjour toi. Comment sa va ?
- Sa va très bien merci.
- Quesque ta fais ce week end etc ......


Donc mon bute est : récupéré la première ligne de mon fichier en locurence ici ce sera "- Bonjour toi. Comment sa va?". Donc cette première ligne, ou je la stock dans un fichier .... ou je la stock dans une variable (je préféreré dans une variable) de façon ce que :

%a%==Bonjours toi. Comment sa va ?

Tu vois ce que je veu dire ?

Merci.
Expert Programmation

Citation :
batchy tu m'a di que pour récupeerer la première ligne d'un fichier dans uen variable il fallait faire : je cite

Citation :
avoir un fichier contenant 'nomdubatch --unargumentquel'ontesteracarilestimportant, faire une concaténation binaire de ce fichier et du fichier que tu veux et lancer cet autre fichier comme un batch


Mais es tu sur d'avoir bien compris pas question ??
oui, par contre tu n'a pas compris ma solution :) 

en gros il faut un fichier qui contient "nomdubatch --unargumentquel'ontesteacarilestimportant '' (je l'appelle entete.txt)

une fois concaténé binairement a ton fichier on aura un fichier du type :
  1. nomdubatch --unargumentquel'ontesteacarilestimportant - Bonjour toi. Comment sa va ?
  2. - Sa va très bien merci.
  3. - Quesque ta fais ce week end etc ......
donc si le nom de notre fichier batch s'appelle "firsline.bat'', on à :
  1. firsline.bat --unargumentquel'ontesteacarilestimportant - Bonjour toi. Comment sa va ?
  2. - Sa va très bien merci.
  3. - Quesque ta fais ce week end etc ......


ensuite on execute ce fichier comme si c'était lui même un fichier bat

lorsqu'on utilise pas call pour appeler un autre fichier batch, lorsque l'autre batch aura fini ça reviendra pas au précédent

donc en gros les actions éxécutées seront :

  1. copy /b entete.txt+fichier.txt temp.bat (on concatène la chaine ''firsline.bat --unargumentblablabla")
  2. temp.bat

qui lui execute :
  1. firsline.bat --unargumentquel'ontesteacarilestimportant - Bonjour toi. Comment sa va ?

au debut de firsline.bat, on à la ligne :
  1. if "%1"=="--unargumentquel'ontesteacarilestimportant" goto suite

donc après l'étiquette
  1. :suite
on à la premiere ligne du fichier en parametre (par exemple %1="-" %2="Bonjour" %3="toi." ect ...), comme il faut ça dans une variable, alors on lance une petite boucle pour tout mettre dans une chaine
  1. :getparam
  2. set arg=%arg%%1 >nul
  3. shift
  4. if not "%1"=="" goto getparam


donc en gros on rajoute chaque argument tour a tour avec un espace pour reconstituer ''- Bonjour toi. Comment ça va ?'', qui se trouve dans la variable %arg%

Oui Je Sais, c'est moche comme solution, mais de toute facon c'est la philosophie du batch que de bidouiller avec du rien...

méthode plus simple pour extraire la première ligne d'un fichier texte :

  1. C:\temp>type data.txt
  2. - Bonjour toi. Comment sa va ?
  3. - Sa va trÞs bien merci.
  4. - Quesque ta fais ce week end
  5.  
  6. C:\temp>type essai.bat
  7. @echo off
  8.  
  9. for /f "tokens=*" %%i in ('type %1') do (
  10. echo %%i
  11. goto end
  12. )
  13.  
  14. :end
  15.  
  16. C:\temp>essai.bat data.txt
  17. - Bonjour toi. Comment sa va ?
  18.  
  19. C:\temp>

olala je comprend rien c'est horrible. Bon batchy ce qui est bien c'est que tu sors de ces truc et tu pense que je vais comprendre !! Dès la première phrase je suis largué !! dsl

pour damocles j'arrive à suivre seulement jusqu'a la ligne "16".

Ce que je ne comprend pas c'est :

1° à la ligne 16 quesqu'il fait ?? il appelle 2 fichier différent en meme temps ??

2° D'après ce que j'ai compris cette 1er ligne n'est stocké nul part ! aucune variable ... aucune redirection vers un fichier txt ??


Merci à tous et désolé de ne pas trop comprendre ce que vous dites ....

en fait, il faut lire comme ça (désolé, je me rends compte que le post n'est pas clair)

- mon fichier de test : data.txt, il contient :
  1. - Bonjour toi. Comment sa va ?
  2. - Sa va trÞs bien merci.
  3. - Quesque ta fais ce week end


- mon fichier de commandes, nommé 'essai.bat', pour extraire la 1ere ligne :
  1. @echo off
  2.  
  3. for /f "tokens=*" %%i in ('type %1') do (
  4. echo %%i
  5. goto end
  6. )
  7.  
  8. :end


- un petit test : pour vérifier que ça marche :
  1. C:\temp>essai.bat data.txt
  2. - Bonjour toi. Comment sa va ?


à la ligne 16 (de mon message précédent), j'appelle mon fichier de commandes en lui passant en paramètre mon fichier de données.
la première ligne du fichier n'est pas stockée en effet. mais rien n'empêche de le faire... moi j'ai seulement fait un 'echo' de la ligne.
Pour la redirection, c'est pareil. Ce n'est pas fait, mais ce n'est pas bien difficile :) 

Bon le post date un peu, mais je vais quand meme apporter une réponse.
En reprenant le code de damocles, voilà comment récupérer dans une variable la 1ere ligne de ton fichier :
En admettant que ton fichier s'appelle fichier.txt
  1. @echo off
  2. cls
  3. for /f "tokens=*" %%i in ('type "fichier.txt"') do (
  4. set v=%%i
  5. goto end
  6. )
  7. :end
  8. pause
  9. echo %v%
  10. pause


le contenu est donc stocké dans la variable v
j'ai rajouté un echo apres une pause afin d'afficher le résultat (contenu de la variable v), mais c'est juste un test.
Lassé par la pub ? Créez un compte