Purge de fichiers dans des repertoires recurcifs

rach95 Messages postés 5 Date d'inscription mardi 29 juin 2010 Statut Membre Dernière intervention 1 juillet 2010 - 29 juin 2010 à 19:20
rach95 Messages postés 5 Date d'inscription mardi 29 juin 2010 Statut Membre Dernière intervention 1 juillet 2010 - 1 juil. 2010 à 18:28
Bonjour, j'aimerai créer un script faisait une purge de fichiers de plus de 30 jours sur le repertoire suivant :

D:\PROD\Interfaces\*\*\log

le premier * correspond à tous les codes société
Le second aux applications

je suis novice en VBS, j'ai essayé de le faire en mode commande sur windows (2003 server) mais le systeme ne reconnait pas les *

Voici le script standard sur windows en mode commande :

REM Purge des fichiers log datant de plus de %delay%
set delay=30
REM Suppression des fichiers de log des interfaces
forfiles /P D:\PROD\Interfaces\*\*\log /M * /D -%delay% /C "CMD /c del @PATH0x09"

Il ne fonctionne pas à cause des * qu'il ne reconnait pas
C'est donc pour cela que je demande de l'aide afin d'avoir un script VBS qui fonctionne avec ce mode recurcif

Merci pour votre aide

9 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 juin 2010 à 20:07
Salut
Ce n'est pas que Windows te refuse ta syntaxe, c'est que la syntaxe n'est pas correcte :
D:\PROD\Interfaces\*\*\log

-1- voudrait dire que tu recherches les fichiers nommés "LOG."
Or, tu recherches les fichiers dont l'extension est LOG, non ?
Ceci serait plus adapté, je pense :
D:\PROD\Interfaces\*\*.log

-2- \*\* pour désigner deux niveaux de sous-répertoire n'a pas de sens en Windows.
En général, la recherche dans les sous-répertoires se fait grâce à des options de la commande, comme le /S de la commande DIR.

En effet, je viens de vérifier : /S pour la commande forfiles
Pense à regarder dans l'aide de la fonction :
dans une fenêtre DOS, tu tapes :
forfiles /?
et tu auras toutes options de la ligne de commande

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
rach95 Messages postés 5 Date d'inscription mardi 29 juin 2010 Statut Membre Dernière intervention 1 juillet 2010
30 juin 2010 à 15:07
Bonjour et merci pour votre réponse, en fait je voudrai purger tous les fichiers quelque soit leur extension dans le répertoire log car log est bien un répertoire.

Pour le /S j'ai déjà testé cette option mais malheureusement ca ne fonctionne pas , j'ai une message d'erreur suivant quand je lance le script :

Erreur : Argument ou option non valide - 'D:\PROD\Interfaces\*\*\log' .
Entrez "FORFILES /?" pour afficher la syntaxe.

J'ai l'impression que c'est du aux * qui n'accepte pas
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
1 juil. 2010 à 13:32
 Bonjour le Forum,

Effectivement, il faut contourner les *

Option Explicit
FindFolder "D:\PROD\Interfaces","\LOG",30

Function FindFolder(argPath, argFolder, argDays) 
   Dim objFso, objSubFolderItem, objSubFileItem  
   Set objFso = CreateObject("Scripting.FileSystemObject") 
   If objFso.FolderExists(argPath) Then
      For Each objSubFolderItem In  objFso.GetFolder(argPath).SubFolders 
          FindFolder objSubFolderItem.Path, argFolder, argDays
          If Right(objFso.GetFolder(objSubFolderItem).Path,4) = argFolder Then
             For Each objSubFileItem In objFso.GetFolder(objSubFolderItem).Files 
                 If DateDiff("d", FormatDateTime(objSubFileItem.DateLastModified, 2),Date) >= argDays Then
                    msgbox objSubFileItem.Name & vbCrLf & objSubFileItem.DateLastModified 
                    'Supprimer le fichier
'''''''''''''''''''''objFso.DeleteFile objSubFileItem.Path 
                 End if
             Next
          End if
      Next 
   End if
   Set objFso = Nothing    
End Function 





jean-marc
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
1 juil. 2010 à 13:55
Petite correction pour être cohérent



If Right(objFso.GetFolder(objSubFolderItem).Path,len(argFolder)) = argFolder Then
 



jean-marc
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rach95 Messages postés 5 Date d'inscription mardi 29 juin 2010 Statut Membre Dernière intervention 1 juillet 2010
1 juil. 2010 à 14:28
Merci JMO pour ton script c'est vraiment sympa et il fonctionne trés bien. Par contre, je voulais juste avoir une petite modification dans le script, en fait au lieu d'avoir la message box qui s'affiche en pop up, je voulais diriger le résultat de la purge dans un fichier log. Si cela est possible je suis preneur , merci pour ton retour.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
1 juil. 2010 à 15:40
Exemple pour écrire dans un fichier txt

Option Explicit
Const MyPath = "D:\PROD\Interfaces"
Const MyFolder = "\LOG"
Const CountDays = 30
Const MyFileReport = "report.txt"

Dim objFso, objTxt
Set objFso = CreateObject("Scripting.FileSystemObject") 
Set objTxt = objFso.CreateTextFile(MyPath & MyFileReport, True)   

FindFolder MyPath, MyFolder, CountDays

objTxt.Close
Set objTxt = Nothing
Set objFso = Nothing 

Function FindFolder(argPath, argFolder, argDays) 
   Dim objSubFolderItem, objSubFileItem 
   If objFso.FolderExists(argPath) Then
      For Each objSubFolderItem In  objFso.GetFolder(argPath).SubFolders 
          FindFolder objSubFolderItem.Path, argFolder, argDays
          If Right(objFso.GetFolder(objSubFolderItem).Path,len(argFolder)) = argFolder Then
             For Each objSubFileItem In objFso.GetFolder(objSubFolderItem).Files 
                 If DateDiff("d", FormatDateTime(objSubFileItem.DateLastModified, 2),Date) >= argDays Then
                    objTxt.WriteLine FormatDateTime(objSubFileItem.DateLastModified, 2) & Space(2) & objSubFileItem.Name 
                    'Supprimer le fichier
'''''''''''''''''''''objFso.DeleteFile objSubFileItem.Path 
                 End if
             Next
          End if
      Next 
   End If
End Function  




jean-marc
0
rach95 Messages postés 5 Date d'inscription mardi 29 juin 2010 Statut Membre Dernière intervention 1 juillet 2010
1 juil. 2010 à 15:53
Merci Jean-Marc, je viens de lister tous les fichiers purgés et j'ai un soucis car en fait il va purger dans le repertoire D:\PROD\Interfaces\ et dés qu'il trouve le repertoire purge alors il va purger les fichiers dans celui ci or ce n'est pas tout à fait ce que je veux en fait car moi il faut qu'il purge dans D:\PROD\Interfaces\ mais seulement deux repertoires aprés c'est pour cela que j'ai mis les 2 * comme ceci :
D:\PROD\Interfaces\*\*\log

le premier * correspond à tous les codes société
Le second aux applications

je sais pas si je suis clair dans mon explication mais c'est sur deux niveau aprés Interfaces qu'il faut purger.

Pour exemple, voilà ce que je ne veux pas :
D:\PROD\Interfaces\LIVRAISONS\20090317\20090317_PL013\html\class\log\log_file.class.php

Et voilà ce que je veux :
D:\PROD\Interfaces\A0\ARCOLE_FACTURE\log\ARCOLE_FACTURE_20090114140207_cdanvy.log


Merci pour ton aide
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
1 juil. 2010 à 16:32
 

Il suffit de "spliter" le répertoire.

Function FindFolder(argPath, argFolder, argDays) 
   Dim objSubFolderItem, objSubFileItem, arrFolder
   If objFso.FolderExists(argPath) Then
      For Each objSubFolderItem In  objFso.GetFolder(argPath).SubFolders 
          FindFolder objSubFolderItem.Path, argFolder, argDays
          arrFolder = Split(objFso.GetFolder(objSubFolderItem).Path,"")
          If UBound(arrFolder) = 5 Then
             If Right(objFso.GetFolder(objSubFolderItem).Path,len(argFolder)) = argFolder Then
                For Each objSubFileItem In objFso.GetFolder(objSubFolderItem).Files 
                    If DateDiff("d", FormatDateTime(objSubFileItem.DateLastModified, 2),Date) >= argDays Then
                       objTxt.WriteLine FormatDateTime(objSubFileItem.DateLastModified, 2) & Space(2) & objSubFileItem.Name 
                       'Supprimer le fichier
''''''''''''''''''''''''objFso.DeleteFile objSubFileItem.Path 
                    End if
                Next             
             End if
          End if
      Next 
   End If
End Function 


jean-marc
0
rach95 Messages postés 5 Date d'inscription mardi 29 juin 2010 Statut Membre Dernière intervention 1 juillet 2010
1 juil. 2010 à 18:28
Super , en tout cas merci beaucoup Jean-Marc
0
Rejoignez-nous