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