traiter plusieurs fichiers d'un répertoire

Une difficulté, une précision posez vos questions

Modérateur : WIN32-[GG]

Répondre
Cemir

traiter plusieurs fichiers d'un répertoire

Message par Cemir »

Bonjour à tous,

Ayant un problème de "batch", je suis tombé sur ce site, ma foi très intéressant, et j'aimerais donc poser mon problème à la comunauté :

Voila j'ai un répertoire contenant pas mal de fichiers, mais je ne dois en traiter que certains via un programme externe. Un petit exemple serra plus clair:

J'ai un répertoire "REP" qui contient 3 sous-répertoires : "IN", "ARCHIVES", "LOGS"

Dans le dossier "IN" j'ai énormément de fichier mais je ne dois traiter que les fichier dont le nom est composé d'une chaine fixe "AAA_BBB_", de la date "20080630" et de l'extension ".txt"

Je dois en fait traiter (différemment) le fichiers "AAA_BBB_DATE.txt" et (uniquement lorsque tous les "AAA_BBB_" ont été traités)les fichiers "AAA_CCC_DATE.TXT".

Voici la séquence complète des opérations :
- prendre le fichier le plus vieux (en fonction de la date dans le nom, et pas de la date système)
- le renommer en tmp_AAA_BBB.txt ou tmp_AAA_CCC.txt (impossible de passer le nom du fichier au prog)
- le traiter (mon_prog.exe trait_AAA_BBB)
- déplacer le fichier dans /ARCHIVES/ en lui redonnant l nom de départ (soit "AAA_BBB_DATE.txt")
- écrire dans /LOGS/log.txt ce qui a été fait (hors ce qui est fait dans le programme externe)
- recommencer pour le fichier suivant !

Voila, j'espère avoir été assez clair, j'attends avec une très grande impatiente une ébauche de solution car je ne vois pas du-tout comment gérer plusieurs fichiers dans une boucle, et surtout comment utiliser le nom des fichiers (ou leur nombre) comme condition d'arrêt de ma boucle.

Bonne lecture et à très bientôt !
Gotcha
Batcheur débutant
Messages : 19
Enregistré le : 04 juin 2008 17:34
Localisation : Pierrelatte (26)
Contact :

Re: traiter plusieurs fichiers d'un répertoire

Message par Gotcha »

Bonjour,
Tu as très bien décortiqué ton problème donc ce sera d'autant plus facile que c'est structuré et cohérent.

As-tu déjà une ébauche ???
Sinon, commences par le début, une chose à la fois.
Le faire est le révélateur de l'être.
http://imageairsoft.free.fr
Cemir

Re: traiter plusieurs fichiers d'un répertoire

Message par Cemir »

Merci pour ta réponse,

non je n'ai pas d'ébauche, je suis bloqué tout au début càd savoir traiter le fichier le plus vieux du répertoire et boucler ensuite sur chaque fichier :lol:

mon programme externe est fait, et les scripts (de ce programme) pour traiter mon fichier aussi

le "seul" point qui bloque c'est cette fameuse boucle, sinon l reste (déplacer, renommer, ...) je devrais m'en sortir

++
Gotcha
Batcheur débutant
Messages : 19
Enregistré le : 04 juin 2008 17:34
Localisation : Pierrelatte (26)
Contact :

Re: traiter plusieurs fichiers d'un répertoire

Message par Gotcha »

Pour éviter des boucles trop compliquées, ce que je fais c'est que j'enregistre les fichiers à traiter dans un fichier texte temporaire par exemple.
Le faire est le révélateur de l'être.
http://imageairsoft.free.fr
Viduc
Batcheur débutant
Messages : 13
Enregistré le : 02 juin 2008 15:02

Re: traiter plusieurs fichiers d'un répertoire

Message par Viduc »

Salut,

Je me suis cassez un peu la tête sur ton problème depuis trois jours^^... puis ne trouvant pas de solution pour tout un tas de problème, je me suis tourné vers le vbs.... comme je ne connaissais pas ce langage je me suis dit c'est l'occasion de s'y mettre :D :lol:

J'ai réussit à faire un truc qui fonctionne, bien sure je pense qu'il peut être largement amélioré... comme je disais je viens juste de me mettre au vbs donc j'imagine que y'a pas mal de chose qui pourrait être amélioré^^....

voici le code:

Code : Tout sélectionner

'---------------------------------Déclaration des Fonctions-------------------------------
'===FONCTION TRIETABBB===
Function TRIETAB(byref tab)
'Traitement des fichiers par année
Dim cle, key 
tmp_an = "2009"
tmp_mois = "13"
tmp_jour = "32"
a = 0
'Extraction du plus ancien fichier
Do While a<UBound(tab)
    key = tab(a)
    If key<>"done" Then      
        If tab_fichier(key)(3)<=tmp_an Then
            If tab_fichier(key)(4)<=tmp_mois Then
                If tab_fichier(key)(5)<=tmp_jour Then
                    cle = key
                    tmp_an = tab_fichier(key)(3)
                    tmp_mois = tab_fichier(key)(4)
                    tmp_jour = tab_fichier(key)(5)
                    tab(a)="done"
                End If
            End If
         End If
    End If
     a = a+1
Loop
TRIETAB = cle
End Function

'===PROCEDURE WRITELOG===
Sub WRITELOG(byval nom_fichier)
    Dim logFSO, writeLog, fileLog
    Const PathDossierLog = "C:\REP\LOGS\log.txt"
    Const ForAppending = 8, TristateUseDefault = -2 
    Set logFSO = CreateObject("scripting.filesystemobject")
    Set fileLog =  logFSO.GetFile(PathDossierLog)
    Set writeLog = fileLog.OpenAsTextStream(ForAppending, TristateUseDefault)
    writeLog.WriteLine("Le fichier " & nom_fichier & " a été traité avec succès") 
End Sub

'===PROCEDURE TRAITEMENT===
Sub TRAITEMENT(byval nom_fichier)
'Traitement du fichier par programe externe
'fichier = "tmp_" & nom_fichier
'Set wshell=CreateObject("WScript.Shell")
'wshell.Run "mon_prog.exe fichier"
End Sub

'===PROCEDURE MOVEINTEMP===
Sub MOVEINTEMP(byval nom_fichier)
'Déplacement du fichier dans dossier TEMP en le renommant
source_fichier = "C:\REP\IN\" & nom_fichier
dest_fichier = "C:\REP\TEMP\tmp_" & nom_fichier
Dim fileFSO
Set fileFSO = CreateObject("scripting.filesystemobject")
fileFSO.MoveFile source_fichier, dest_fichier
End Sub

'===PROCEDURE MOVETEMPARCHIVES===
Sub MOVETEMPARCHIVES(byval nom_fichier)
'Déplacement du fichier traiter dans dossier ARCHIVE en le renommant
source_fichier_fin = "C:\REP\TEMP\tmp_" & nom_fichier
dest_fichier_fin = "C:\REP\ARCHIVES\" & nom_fichier
Dim archFSO
Set archFSO = CreateObject("scripting.filesystemobject")
archFSO.MoveFile source_fichier_fin, dest_fichier_fin
End Sub

'-----------------------------------------------------------------------------------------
'-------------------------------------Corps du Programe-----------------------------------

'Création de la class fichier
Class class_fichier 
    Dim def1
    Dim def2
    Dim anf
    Dim moisf
    Dim jourf
End Class

'Déclaration des variables principales
Const PathDossier = "C:\REP\IN" 
Dim fso, dossier, fichier, cfichier, file 
tab_fichier=Array() 
Dim sub_tab_fichier(5)

'Scann du répertoir IN
Set fso = CreateObject("scripting.filesystemobject")
Set dossier =  fso.GetFolder(PathDossier)
Set fichier = dossier.Files

'Formatage et stockage de la liste dans un tableau: tab_fichier
'Utilisation d'un sous tableau (sub_tab_fichier) pour le formatage 
i=0 
For Each file In fichier
    file = Right(file,20)
    file = Left(file,16)
        Set cfichier = New class_fichier
        cfichier.def1 = Left(file,3)
        sub_tab_fichier(0) = i 'Création d'une clé
        sub_tab_fichier(1) = cfichier.def1
    file = Right(file,12)
        cfichier.def2 = Left(file,3)
        sub_tab_fichier(2) = cfichier.def2
    file = Right(file,8)
        cfichier.anf = Left(file,4)
        sub_tab_fichier(3) = cfichier.anf
    file = Right(file,4)
        cfichier.moisf = Left(file,2)
        sub_tab_fichier(4) = cfichier.moisf
    file = Right(file,2)
        cfichier.jourf = file
        sub_tab_fichier(5) = cfichier.jourf
    ReDim Preserve tab_fichier(i+1)
    tab_fichier(i) = sub_tab_fichier
    i = i+1
Next

'Premier trie des fichiers entre les BBB et CCC
tab_bbb=Array()
tab_ccc=Array()
a = 0 
b = 0
c = 0
'les fichiers sont séparés dans deux tableaux différents via leur clé
Do While a<ubound(tab_fichier) 
    if tab_fichier(a)(2)="BBB" Then
    ReDim Preserve tab_bbb(b+1)
    tab_bbb(b) = tab_fichier(a)(0)
    b = b+1
    End If
    
    if tab_fichier(a)(2)="CCC" Then
    ReDim Preserve tab_ccc(c+1)
    tab_ccc(c) = tab_fichier(a)(0)
    c = c+1
    End If
    
    a = a+1
loop

'Traitement des fichiers bbb
d = 0
Do While d<UBound(tab_bbb)
    'trie du plus ancien fichier bbb
    cle = TRIETAB(tab_bbb)
    'Reconstruction du nom du fichier 
    nom_fichier = tab_fichier(cle)(1) & "_" & tab_fichier(cle)(2) & "_" & tab_fichier(cle)(3) & tab_fichier(cle)(4) & tab_fichier(cle)(5) & ".txt"
    'déplacement du plus ancien fichier dans rep TEMP
    MOVEINTEMP nom_fichier
    'Traitement du fichier par programe externe
    TRAITEMENT nom_fichier
    'Déplacement du fichier traiter dans dossier ARCHIVE en le renommant
    MOVETEMPARCHIVES nom_fichier
    'Enregistrement dans fichier LOG.txt (Procédure)
    WRITELOG nom_fichier 
d = d+1
Loop

'Traitement des fichiers ccc
d = 0
Do While d<UBound(tab_ccc)
    'trie du plus ancien fichier bbb
    cle = TRIETAB(tab_ccc)
    'Reconstruction du nom du fichier 
    nom_fichier = tab_fichier(cle)(1) & "_" & tab_fichier(cle)(2) & "_" & tab_fichier(cle)(3) & tab_fichier(cle)(4) & tab_fichier(cle)(5) & ".txt"
    'déplacement du plus ancien fichier dans rep TEMP
    MOVEINTEMP nom_fichier
    'Traitement du fichier par programe externe
    TRAITEMENT nom_fichier
    'Déplacement du fichier traiter dans dossier ARCHIVE en le renommant
    MOVETEMPARCHIVES nom_fichier
    'Enregistrement dans fichier LOG.txt (Procédure)
    WRITELOG nom_fichier 
d = d+1
loop
tu le copies dans un bloc note par exemple et tu l'enregistre en machintruc.vbs

Il faut penser à revoir les dossiers. Perso j'ai utilisé l'arborescence suivant:
c:\REP\
ARCHIVES
IN
LOGS
TEMP (qui n'existe pas chez toi et qu'il faut donc créer....)

Il faut également penser à créer le fichier log.txt dans le rep LOGS

La dernière chose se situe au niveau de ton programe externe.... tu verras j'ai créer une procédure (fonction) pour ça mais j'ai tout mit en commentaire car je ne sais pas ce que c'est comment elle fonctionne etc.... le

Code : Tout sélectionner

'Set wshell=CreateObject("WScript.Shell")
'wshell.Run "mon_prog.exe fichier"
fonction pour lancer un .bat par exemple mais je n'ai pas tester si l'on peut passer comme ça le fichier en argument à ton programe donc à tester^^....

Voilà si tu as besoins d'info d'explication d'amélioration ou autre hésites^^... pi si y'en a qui maîtrisent le vbs hésitez pas à améliorer mon script pas de souci^^.... et si y'en a un qui arrive à faire ça en batch alors là bravo^^ je serais interressé de voir comment il fait ça ;) :D
Répondre