[VBS][RESOLU][SCRIPT]Script de suppression de fichiers temporaires

Script de suppression de fichiers temporaires [VBS][RESOLU][SCRIPT] - VB/VBA/VBS - Programmation

Marsh Posté le 17-06-2009 à 10:37:01    

Bonjour,

 

J'ai créé un script pour dégager des fichiers temporaires du disque c:\ et ainsi gagner de la place de manière automatique.

 

MERCI à : magicbuzz

 

Le code fonctionne de la manière suivante :

  • Création d'un cmdline.bat à la racine de c:\
  • Si c:\temp existe, alors on rajoute au .bat une ligne de suppression pour le contenu du répertoire
  • si c:\tmp existe, alors on rajoute au .bat une ligne de suppression pour le contenu du répertoire
  • si c:\%windir%\temp existe, alors on rajoute au .bat une ligne de suppression pour le contenu du répertoire
  • Pour chaque répertoire de KBwindows ($xxxx$) contenu dans %windir%, si son ancienneté est de plus de 2 mois, alors on rajoute au .bat une ligne de suppression pour le répertoire et son contenu
  • Pour chaque repertoire de c:\documents and settings\, si le répertoire "c:\documents and settings\repertoire\local settings\temp" existe, alors on rajoute au .bat une ligne de suppression pour le contenu du répertoire
  • on ferme le cmdline.bat
  • on quitte le script en exécutant cmdline.bat


Voici le code :

Code :
  1. '-------------------------------------------------------------------------
  2. ' SCRIPT DE SUPPRESSION DE FICHIERS TEMPORAIRES
  3. ' AUTEUR : nixnbk
  4. '-------------------------------------------------------------------------
  5.  
  6. '-------------------------------------------------------------------------
  7. ' DECLARATION DES VARIABLES
  8. '-------------------------------------------------------------------------
  9. dim CmdLine, folder,fdocuments
  10. dim WINDIR
  11.  
  12. Set WshShell = WScript.CreateObject("WScript.Shell" )
  13. WINDIR = WshShell.ExpandEnvironmentStrings("%WinDir%" )
  14.  
  15. Set fso = CreateObject("Scripting.FileSystemObject" )
  16. Set MyFile = fso.CreateTextFile("c:\CmdLine.bat" , True)
  17.  
  18.  
  19. '-------------------------------------------------------------------------
  20. ' SUPPRESSION pour C:\TEMP
  21. '-------------------------------------------------------------------------
  22. folder = "c:\temp"
  23. if fso.FolderExists(folder) then
  24.     CmdLine = "del " & folder & "\*.* /Q /F /S"
  25.     MyFile.WriteLine(CmdLine)
  26. end if
  27.  
  28. '-------------------------------------------------------------------------
  29. ' SUPPRESSION pour C:\TMP
  30. '-------------------------------------------------------------------------
  31. folder = "c:\tmp"
  32.  
  33. if fso.FolderExists(folder) then
  34.     CmdLine = "del " & folder & "\*.* /Q /F /S"
  35.     MyFile.WriteLine(CmdLine)
  36. end if
  37.  
  38. '-------------------------------------------------------------------------
  39. ' SUPPRESSION pour %WINDIR%\TEMP
  40. '-------------------------------------------------------------------------
  41. folder = WINDIR & "\temp"
  42.  
  43. if fso.FolderExists(folder) then
  44.     CmdLine = "del " & folder & "\*.* /Q /F /S"
  45.     MyFile.WriteLine(CmdLine)
  46. end if
  47.  
  48. '----------------------------------------------------------------------------------
  49. ' SUPPRESSION pour %WINDIR%\$xxx$ (KB WINDOWS) si plus vieux que 2 mois (60 jours)
  50. '----------------------------------------------------------------------------------
  51. if fso.FolderExists(WINDIR) then
  52.     For Each folder in fso.GetFolder(WINDIR).SubFolders
  53.         If Len(folder.Name) > 2 and Right(folder.Name, 1) = "$" and Left(folder.Name, 1) = "$" and folder.DateLastModified < DateAdd("d", -60, Now()) Then
  54.             CmdLine = "rmdir " & folder & " /S /Q"
  55.             MyFile.WriteLine(CmdLine)
  56.         End If
  57.   Next
  58. End if
  59.  
  60. '-------------------------------------------------------------------------
  61. ' SUPPRESSION pour C:\DOCUMENTS AND SETTINGS\%USER%\LOCAL SETTINGS\TEMP
  62. '-------------------------------------------------------------------------
  63. fdocuments = "c:\documents and settings\"
  64. if fso.FolderExists(fdocuments) then
  65.     For Each folder in fso.GetFolder(fdocuments).SubFolders
  66.         folder = folder & "\Local Settings\temp"
  67.         if fso.FolderExists(folder) then
  68.             CmdLine = "del """ & folder & "\*.*"" /Q /F /S"
  69.             MyFile.WriteLine(CmdLine)
  70.         end if
  71.     next
  72. end if
  73.  
  74.  
  75. '-------------------------------------------------------------------------
  76. ' FIN SCRIPT ET EXECUTION DU FICHIER BAT
  77. '-------------------------------------------------------------------------
  78. MyFile.Close
  79. Set MyFile = Nothing
  80. Set fso = Nothing
  81. Return = WshShell.Run ("c:\CmdLine.bat",10,TRUE)
 


Je mets ici le message original :
-----------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------
Bonjour,

 

Je suis en train de tenter de réaliser un script VBS pour supprimer des répertoires selon une date d'ancienneté.

 

Globalement le script est OK, sauf qu'on ma demandé de supprimer des répertoires présents dans %windir% et donc ça devient vachement sensible.

 

En gros je voudrais tester et supprimer tous les répertoires %windir%\$*$
(exemple : $hfmig$ $ntuninstallKB123456$ etc.)
Je peux pas nommer les KB à la main, parce que y'en a trop et que c'est trop long.
Et apparemment le répertoire %windir%\$*$ ça fonctionne pas.
(je stocke dans un array le string : %windir%\$*$)

 

J'ai fait des tests sous le cmd, ça fonctionne avec la commande dir (dir %windir%\$*$)

 

Ma question est donc : comment je peux stocker dans un array chaque ligne de résultat de mon dir ?

 


Une idée ?

 

Je fais également mes recherches de mon coté.
Quand j'aurai résolu mon problème je ferai un tuto en premier post.

 


Bonne journée,

 

Nix.


Message édité par nixnbk le 18-06-2009 à 10:53:07

---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 17-06-2009 à 10:37:01   

Reply

Marsh Posté le 17-06-2009 à 11:42:16    

Bon comme j'arrive pas à récupérer directement depuis le shell, je me suis orienté sur quelque chose de plus simple :  
 
en gros depuis mon vbs, j'éxécute la commande dir et la stocke dans un fichier de résultats :
dir %windir%\$*$ /A:h /B > d:\scripts\recupdir.txt
 
l'argument /A:h affiche les éléments cachés, et /B donne des résultats abrégés.
 
J'ai donc un fichier avec dedans ceci :

$hf_mig$
$NtServicePackUninstall$
$NtUninstallKB915800-v4$
$NtUninstallKB923561$
$NtUninstallKB940157$
$NtUninstallKB952004$
$NtUninstallKB963093$
$NtUninstallKB967715$
$NtUninstallKB968537$
$NtUninstallKB970238$


 
Comment je peux récupérer le fichier ligne par ligne dans mon array  en vbs ?
 


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 17-06-2009 à 11:50:47    

Pourquoi tu utilises pas l'objet de FileSystemObject ?

Reply

Marsh Posté le 17-06-2009 à 11:59:45    

J'ai oublié de préciser que je suis une bille en vbs, et que jusqu'ici je ne fais qu'adapter des scripts déja existant en modifiant quelques fonctions par ci par la.

 

Comment ça fonctionne l'objet fileSystemObject ?

 

EDIT : Je vient de trouver ce que c'est que le fso... et j'ai vu un opentextfile dedans.


Message édité par nixnbk le 17-06-2009 à 12:00:51

---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 17-06-2009 à 12:04:02    

Par contre je vois pas comment après avoir ouvert mon fichier texte je peux récupérer chaque ligne.
 
Je vois bien une boucle basée sur un retour du nombre de ligne dans laquelle je rentre dans l'array chaque ligne....
Mais je vois pas quelle commande utiliser pour retourner le nombre de lignes dans le fichier ou récupérer la ligne 1,2,3 etc.


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 17-06-2009 à 13:01:27    

http://devguru.com/technologies/vbscript/14048.asp
http://devguru.com/technologies/vbscript/13990.asp
etc.
 
en jouant avec Folders, tu pourras sans problème parcourir la liste des $KBxxxxx$ de ton répertoire, et en faire ce que tu veux

Reply

Marsh Posté le 17-06-2009 à 15:23:28    

En fait j'ai trouvé le moyen de récupérer les ligne d'un fichier texte  sur le sujet suivant :
http://forum.hardware.fr/hfr/Progr [...] m#t1360217

 


Le problème c'est de boucler les lignes.

 

En gros l'algo que je veux appliquer :

 

chemin = c:\monfichier.txt
fichier = opentextfile(chemin,1)
pour chaque ligne de fichier.txt non vide
     ligne= fichier.readline
     Si %windir%\ligne.datelastmodified plus vieux que 2 mois Alors
          actions à réaliser
      endif
fin boucle

 

Une idée pour le bouclage ?


Message édité par nixnbk le 17-06-2009 à 15:23:45

---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 17-06-2009 à 15:47:59    

Franchement, tu ferais une boucle sur les items de Folders, ça serait quand même plus propre...

Reply

Marsh Posté le 17-06-2009 à 16:24:55    

MagicBuzz a écrit :

Franchement, tu ferais une boucle sur les items de Folders, ça serait quand même plus propre...


J'vois pas trop comment faire...
 
voici ou j'en suis dans mon script pour l'instant :
 

Code :
  1. dim CmdLine,CmdDir
  2. dim ligne
  3. dim chemintxt = "c:\recupdir.txt"
  4. Set WshShell = WScript.CreateObject("WScript.Shell" )
  5. Set fso = CreateObject("Scripting.FileSystemObject" )
  6. Set MyFile = fso.CreateTextFile("c:\CmdLine.bat" , True)
  7. set folderpath = "c:\temp"
  8. if fso.FolderExists(folderpath)
  9.      CmdLine = "del " & folderpath & "\*.* /Q /F /S"
  10.      MyFile.WriteLine(CmdLine)
  11. end if
  12. folderpath = "c:\tmp"
  13. if fso.FolderExists(folderpath)
  14.      CmdLine = "del " & folderpath & "\*.* /Q /F /S"
  15.      MyFile.WriteLine(CmdLine)
  16. end if
  17. folderpath = "%windir%\tmp"
  18. if fso.FolderExists(folderpath)
  19.      CmdLine = "del " & folderpath & "\*.* /Q /F /S"
  20.      MyFile.WriteLine(CmdLine)
  21. end if
  22. set DirFile = fso.createTextFile("c:\dirline.bat", True)
  23. CmdDir = "dir %windir%\$*$ /A:h /B >" & chemintxt
  24. DirFile.WriteLine(CmdDir)
  25. DirFile.Close
  26. set DirFile = CreateObject("WScript.Shell" )
  27. DirFile.run("c:\dirline.bat",TRUE)
  28. if fso.FileExists(chemintxt) then
  29. set ouvrir=fso.opentextfile(chemintxt,1)
  30. 'boucle de 1 a nombre de lignes' dans recupdir.txt
  31.  ligne = ouvrir.readline
  32.  folderpath = "%windir%\" & ligne
  33.  if DateDiff("d",fso.GetFolder(folderpath).DateLastModified,date() ) > JOUR then
  34.   CmdLine = "rmdir " & folderpath & " /S /Q"
  35.   MyFile.WriteLine(CmdLine)
  36.  end if
  37. 'fin boucle
  38. end if
  39. MyFile.Close
  40. Set MyFile = Nothing
  41. Set fso = Nothing
  42. Return = WshShell.Run (sourcepath & "\CmdLine.bat",10,TRUE)


 
 
Pour la boucle je cherche mais j'trouve toujours pas :/


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 17-06-2009 à 16:45:03    

Un truc du genre :

Code :
  1. Option Explicit
  2.  
  3. Const WINDIR = "c:\windows"
  4. Dim fso
  5. Dim wsh
  6.  
  7. Dim fol
  8.  
  9. Set fso = CreateObject("Scripting.FileSystemObject" )
  10. Set wsh = WScript.CreateObject("WScript.Shell" )
  11.  
  12. If fso.FolderExists(WINDIR) Then
  13.    For Each fol in fso.GetFolder(WINDIR).SubFolders
  14.        If Len(fol.Name) > 2 and Right(fol.Name, 1) = "$" and Left(fol.Name, 1) = "$" and fol.DateLastModified < DateAdd("d", -60, Now()) Then
  15.            fso.DeleteFolder(fol)
  16.        End If
  17.    Next
  18.    MsgBox("OK" )
  19. Else
  20.    MsgBox("On a un problème là..." )
  21. End if

Reply

Marsh Posté le 17-06-2009 à 16:45:03   

Reply

Marsh Posté le 17-06-2009 à 16:55:37    

En gros ton script teste pour chaque sous répertoire du windir si il contient + que 2 caractères, si son premier et dernier caractère est "$" ...
C'est bien ça ?

 

vais tenter d'adapter ça...

 

Par contre il y a un problème avec ta variable windir : si on est sous 2000 alors le windir = c:\winnt.
Résultat on se prend le msgbox : "on a un problème la..."
Ya pas moyen de travailler avec %windir% plutôt que de la définir en dur ?

 

Merci en tout cas pour le temps passé.


Message édité par nixnbk le 17-06-2009 à 16:55:49

---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 17-06-2009 à 16:58:21    

ben j'ai essayé, mais pas trouvé pour récupérer %windir%
 
cependant, fso a un GetSpecialFolder().
j'imagine qu'un truc genre fso.GetSpecialFolder("windir" ) devrait bien aider

Reply

Marsh Posté le 17-06-2009 à 16:59:57    

trouvé pour le windir :  
dim WINDIR
Set WshShell = WScript.CreateObject("WScript.Shell" )
WINDIR = WshShell.ExpandEnvironmentStrings("%WinDir%" )
 
:o


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 17-06-2009 à 17:18:39    

bon grâce à ton bout de code j'ai pu finir mon script. Le voici :  

Code :
  1. dim CmdLine, folder
  2. dim WINDIR
  3.  
  4. Set WshShell = WScript.CreateObject("WScript.Shell" )
  5. WINDIR = WshShell.ExpandEnvironmentStrings("%WinDir%" )
  6.  
  7. Set fso = CreateObject("Scripting.FileSystemObject" )
  8. Set MyFile = fso.CreateTextFile("c:\CmdLine.bat" , True)
  9. folder = "c:\temp"
  10. set DirFile = fso.createTextFile("c:\dirline.bat", True)
  11.  
  12.  
  13. if fso.FolderExists(folder) then
  14.     CmdLine = "REM del " & folder & "\*.* /Q /F /S"
  15.     MyFile.WriteLine(CmdLine)
  16. end if
  17.  
  18. folder = "c:\tmp"
  19.  
  20. if fso.FolderExists(folder) then
  21.     CmdLine = "REM del " & folder & "\*.* /Q /F /S"
  22.     MyFile.WriteLine(CmdLine)
  23. end if
  24.  
  25. folder = WINDIR & "\temp"
  26.  
  27. if fso.FolderExists(folder) then
  28.     CmdLine = "REM del " & folder & "\*.* /Q /F /S"
  29.     MyFile.WriteLine(CmdLine)
  30. end if
  31.  
  32. if fso.FolderExists(WINDIR) then
  33.     For Each folder in fso.GetFolder(WINDIR).SubFolders
  34.         If Len(folder.Name) > 2 and Right(folder.Name, 1) = "$" and Left(folder.Name, 1) = "$" and folder.DateLastModified < DateAdd("d", -60, Now()) Then
  35.             CmdLine = "REM rmdir " & folder & " /S /Q"
  36.             MyFile.WriteLine(CmdLine)
  37.       End If
  38.   Next
  39. End if
  40. CmdLine = "pause"
  41. MyFile.WriteLine(CmdLine)
  42. MyFile.Close
  43. Set MyFile = Nothing
  44. Set fso = Nothing
  45. Return = WshShell.Run ("c:\CmdLine.bat",10,TRUE)


 
Et le .bat de résultat :  

REM del c:\tmp\*.* /Q /F /S
REM del C:\WINDOWS\temp\*.* /Q /F /S
REM rmdir C:\WINDOWS\$NtServicePackUninstall$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB952069_WM9$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB954459$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB954600$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB955069$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB955839$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB956802$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB957097$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB958215$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB958687$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB958690$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB959772_WM11$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB960225$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB960714$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB960715$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB961118$ /S /Q
REM rmdir C:\WINDOWS\$NtUninstallKB967715$ /S /Q
pause


 
J'ai vérifié tout fonctionne. J'enlève les REM et je met le sujet en résolu.
 
Merci magicbuzz.


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 17-06-2009 à 17:36:03    

J'viens de me rendre compte qu'il manque encore toute une partie à mon script :  
Faudrait aussi que je vide les repertoire temp de chaque user.
donc en gros : récupérer pour chaque sous répertoire de c:\documents and settings\ (variable windows ???) le répertoire \local settings\temp et le vider.
 
Je commence à chercher. Globalement niveau Algo ça devrait pas changer des masses de celui des Kb windows.


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 18-06-2009 à 10:52:11    

Problème résolu, modification du premier post et publication du code.
 
n'hésitez pas à me faire un retour si on peut améliorer le code.
 
Bonne journée,
 
nix.


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed