Rechercher des dossiers et les supprimer

Rechercher des dossiers et les supprimer - Shell/Batch - Programmation

Marsh Posté le 08-10-2005 à 08:50:10    

Bonjour tout le monde,  
 
Je cherche une solution en batch afin d'effectuer une recherche spécifique sur une partition.  
 
Je souhaite rechercher tous les dossiers intitulés "toto" et qu'à la suite de cette recherche, ces dossiers "toto" (et leur contenu) soit effacés.  
 
Quelqu'un aurait-il une solution à me proposer ?
 
Un grand merci par avance.


---------------
Si ça continue, va falloir qu'ça cesse !!!
Reply

Marsh Posté le 08-10-2005 à 08:50:10   

Reply

Marsh Posté le 08-10-2005 à 10:39:21    

Pourrais-tu indiquer, s'il te plait, sous quel système d'exploitation, et avec quel shell s'il s'agit d'Unix ?

Reply

Marsh Posté le 08-10-2005 à 10:52:45    

olivthill a écrit :

Pourrais-tu indiquer, s'il te plait, sous quel système d'exploitation, et avec quel shell s'il s'agit d'Unix ?


 
Oups, désolé...  
 
W2k et XP


---------------
Si ça continue, va falloir qu'ça cesse !!!
Reply

Marsh Posté le 08-10-2005 à 11:39:56    

Pour obtenir la liste de tous les dossiers en dessous de C:\Scripts, j'itilise le script suivant :

Code :
  1. Set FSO = CreateObject("Scripting.FileSystemObject" )
  2. ShowSubfolders FSO.GetFolder("C:\\Scripts" )
  3. Sub ShowSubFolders(Folder)
  4.     For Each Subfolder in Folder.SubFolders
  5.         Wscript.Echo Subfolder.Path
  6.         ShowSubFolders Subfolder
  7.     Next
  8. End Sub

Ces lignes sont mise dans un fichier "searchfolder.vbs" que l'on exécute en cliquant dessus, ou en tapant "cscript.exe searchfolder.vbs" depuis une fenêtre DOS.
 
En l'adaptant un peu, j'obtiens le script pour supprimer tous les dossiers intitulés "toto" qui se trouvent en dessous de "c:\test":

Code :
  1. Set FSO = CreateObject("Scripting.FileSystemObject" )
  2. subfolder_a_chercher = "toto"
  3. ShowSubfolders FSO.GetFolder("C:\\test" ), subfolder_a_chercher
  4. Sub ShowSubFolders(Folder, subfolder_a_chercher)
  5.     For Each Subfolder in Folder.SubFolders
  6.         If (Subfolder.name = subfolder_a_chercher) Then
  7.             Wscript.Echo Subfolder.name
  8.             FSO.DeleteFolder(Subfolder.Path)
  9.         Else
  10.            ShowSubFolders Subfolder, subfolder_a_chercher
  11.         End If
  12.     Next
  13. End Sub


"Subfolder.Path" renvoie le nom du dossier avec le chemin complet.
"Subfolder.name" renvoie le nom du dossier sans le chemin.
 :)
Edit : J'avais oublié qu'il faut deux antislashs pour que le message en affiche un dans une boite de code.


Message édité par olivthill le 08-10-2005 à 11:42:29
Reply

Marsh Posté le 10-10-2005 à 00:06:08    

Salut,
 
je m'incruste parce que justement je voulais faire exactement la même chose sur un serveur NT4 pour supprimer des dossiers Profils.
 
olivthill, je viens de faire un petit test sur mon W2000, et ça marche nickel!!  :bounce:  
 
Y a t-il moyen d'y apporter deux petites modifications:
1) Ne pas supprimer le dossier "toto" mais juste son contenu
2) A chaque dossier "toto" trouvé, une petite fenêtre s'ouvre pour confirmer. On clique ok et hop au suivant. Comme j'aurais plus de 800 dossiers à supprimer, peut-on passer outre cette fenêtre?

Reply

Marsh Posté le 10-10-2005 à 09:11:43    

Merci pour ta réponse olivthill. Je teste ça et reviens te donner mon feedback (je suis newbie en vbs).


---------------
Si ça continue, va falloir qu'ça cesse !!!
Reply

Marsh Posté le 10-10-2005 à 12:08:51    

Voici une version adaptée pour toi, Ramkin.

Code :
  1. ' Suppression du contenu de certains sous répertoires
  2. Set fso = CreateObject("Scripting.FileSystemObject" )
  3. dossier_a_chercher = "toto"
  4. cherche_dossier fso.GetFolder("C:\\test" ), dossier_a_chercher
  5. ' Rechercher un dossier
  6. Sub cherche_dossier(un_dossier, dossier_a_chercher)
  7.     For Each un_sousdossier In un_dossier.SubFolders
  8.        If (un_sousdossier.name = dossier_a_chercher) Then
  9.           supp_dans_dossier un_sousdossier
  10.        End If
  11.        cherche_dossier un_sousdossier, dossier_a_chercher
  12.     Next
  13. End Sub
  14. ' Supprimer le contenu d'un dossier
  15. Sub supp_dans_dossier(un_dossier)
  16.     ' Supprimer les sous-répertoires
  17.     For Each sf1 in un_dossier.SubFolders
  18.        If (MsgBox("Voulez-vous supprimer " & sf1.Path & " ?", 1) = 1) Then
  19.           fso.DeleteFolder(sf1.Path)
  20.        End If
  21.     Next
  22.     ' Supprimer les fichiers
  23.     For Each f1 in un_dossier.Files
  24.        If (MsgBox("Voulez-vous supprimer " & f1.Path & " ?", 1) = 1) Then
  25.           fso.DeleteFile(f1.Path)
  26.        End If
  27.     Next
  28. End Sub

D'abord, le dossier "toto" est recherché récursivement sous c:\test.
Puis s'il est trouvé, son contenu est supprimé avec demandes de confirmation. Il est bien sûr possible de mettre les demandes de confirmation en commentaire en plaçant une apostrophe en début de ligne dans le code.

Reply

Marsh Posté le 10-10-2005 à 14:48:05    

Merci beaucoup pour ton aide olivthill. J'ai tâtonné un petit peu au début car ton script (modifié avec mes valeurs) ne renvoyait aucun message. Puis je me suis aperçu qu'il fallait respecter la case. :p
 
Maintenant, je teste la solution que tu as soumis à ramkin car elle m'intéresse également ! ;) Je cherche surtout à supprimer la confirmation de suppression.


---------------
Si ça continue, va falloir qu'ça cesse !!!
Reply

Marsh Posté le 10-10-2005 à 19:43:11    

Alors moi je dis:
 

Citation :

:bounce:  :bounce: olivthill Président!! :bounce:  :bounce:


 
Ca marche impec! Et j'ai même compris comment supprimer la boite de dialogue.(qui d'ailleurs est très intelligement faite en rappelant le chemin du ficheir à supprimer..  :jap: )
 
10 000²² merci olivthill!!  
 
 :sol:

Reply

Marsh Posté le 11-10-2005 à 10:57:49    

C'est encore moi!!  :pt1cable:  
 
olivthill, dès que j'abuse tu le dis....  :whistle:  
 
Et dans la même genre d'idée:
 
1) Ca marche super sur un poste. Mais est-ce possible en réseau? Imagine, que des stations XP Pro dont il faut supprimer le même dossier. Problème, je ne vois pas bien quel chemin indiquer en place de "c:\test"
 
2) Et si au lieu de supprimer "toto" je voulais y copier "tata" dedans?
Ca ne serait pas juste ces lignes qu'il faudrait changer?

Citation :

If (Subfolder.name = subfolder_a_chercher) Then  
            Wscript.Echo Subfolder.name  
            FSO.DeleteFolder(Subfolder.Path)


 
 :sol:

Reply

Marsh Posté le 11-10-2005 à 10:57:49   

Reply

Marsh Posté le 11-10-2005 à 11:05:34    

Cela me plait de répondre aux questions, donc si je peux, no problemo.
 
1) En réseau, je ne sais pas, désolé.
 
2) Oui, il faut remplacer les lignes citées, qui contiennent notamment DeleteFolder, par une ligne faisant appel à

FSO.CopyFile source, destination[, overwrite]

Le mot overwrite est optionnel, c'est pour permettre d'écraser un fichier qui existe déjà.
 
Pour copier un dossier, c'est pareil avec CopyFolder à la place de CopyFile  :)


Message édité par olivthill le 11-10-2005 à 11:08:04
Reply

Marsh Posté le 11-10-2005 à 14:08:26    

Et encore une fois, superbe!!!!  :bounce:  
 
Par contre je n'ai pas mis la commande [, overwrite] et ça overwrite quand même.
 
Merci bien pour ton aide, je vais garder ces scripts TRES précieusement.  :hello:  
 
Si jamais il te vient une idée pour faire ça au travers de tout un réseau, je me ferais un plaisir d'être ton bêta-testeur..  :)  
 
 :sol:

Reply

Marsh Posté le 17-10-2005 à 11:08:39    

bonjour lé gars je programme en vbscript mais lé fichiers que j'attaque sont codés en Unicode connaissez vous quel quelques choses  
qui peu m'aider pour lé transformer en ANSI

Reply

Marsh Posté le 20-10-2005 à 22:42:23    


olivthill......  :sweat:  
Je crois que j'ai un gros problème de syntaxe....
Normalement, cette petite fonction récurssivce est censée copier un fichier dans tous les dossiers "toto"
Mais ça coince là où c'est en gras à mon avis...
 
 

Citation :

Set fso = CreateObject("Scripting.FileSystemObject" )
 dossier_a_chercher = "toto"
 cherche_dossier fso.GetFolder("C:\test" ), dossier_a_chercher
 
 Sub cherche_dossier(un_dossier, dossier_a_chercher)
     For Each un_sousdossier In un_dossier.SubFolders
        If (un_sousdossier.name = dossier_a_chercher) Then  
           fso.CopyFile "C:\fichier_a_copier.txt", "un_sousdossier"
        End If
        cherche_dossier un_sousdossier, dossier_a_chercher
     Next
 End Sub
 


 

Reply

Marsh Posté le 21-10-2005 à 11:50:59    

Bonjour Ramkin,
 
Je crois qu'il faut enlever les guillemets et essayer

Code :
  1. fso.CopyFile "C:\fichier_a_copier.txt", un_sousdossier.Path

:)

Reply

Marsh Posté le 21-10-2005 à 19:49:27    

Merci olivthill pour cette réponse rapide.  :jap:  
 
Mais ça marche pas.....
 
http://img444.imageshack.us/img444/5830/clipboard010tc.jpg
 
la ligne 9 caractère 12 est justement le début de cette commande.

Reply

Marsh Posté le 21-10-2005 à 21:20:02    

Le message sur l'image indique "permission refusée". Cela siginifie que l'utilisateur (1) n'a pas le droit de copier le fichier (2) dans le dossier (3). Le problème est probablement dû à une protection du dossier (3), mais peut aussi venir des deux autres facteurs (1) et (2).

Reply

Marsh Posté le 21-10-2005 à 22:22:47    

olivthill a écrit :

Le message sur l'image indique "permission refusée". Cela siginifie que l'utilisateur (1) n'a pas le droit de copier le fichier (2) dans le dossier (3). Le problème est probablement dû à une protection du dossier (3), mais peut aussi venir des deux autres facteurs (1) et (2).


 
Oui mais c'est bien ça qui est bizarre.....C'est sur mon pc à moi, avec un seul utilisateur, administrateur, grand propriétaire de tout, j'ai nommé MOI!  :??:  
 
Tu es absolument certain de la syntaxe?

Reply

Marsh Posté le 22-10-2005 à 00:37:49    

Je viens de faire un essai pour régler cette histoire de permissions.
 
A la première itération, le sub se retrouve dans le dossier C:\test\toto, et c'est alors la valeur de la variable un_sousdossier.
En mettant comme ligne de code:

Citation :

FSO.CopyFile "C:\fichier_a_copier.txt", "c:\test\toto\"


aucun problème de "permission"....et ça fonctionne bien.
 
Donc dans :

Citation :

fso.CopyFile "C:fichier_a_copier.txt", un_sousdossier.Path


 
c'est la référence à un_sousdossier.Path qui n'est pas comprise....
 
 :heink:

Reply

Marsh Posté le 22-10-2005 à 09:43:53    

La solution est :

fso.CopyFile "C:\\fichier_a_copier.txt", un_sousdossier.Path & "\\"

Cettte fois-ci, j'ai pris le temps de tester, et cette nouvelle ligne marche chez moi.
 
Le problème n'était causé par un manque de permission, mais par un nom de dossier ne se terminant pas par un anti-slash "\". Pour le constater, on peut faire un test avec Wscript.Echo un_sousdossier.Path. Donc, il fallait ajouter & "\\" (en VB, c'est le "&" qui permet d'ajouter une chaine à une autre, par exemple "bonjour, " & "tout le monde" ).
 
Excuse-moi de ne pas m'être aperçu plus tôt du problème de l'anti-slash. :)

Reply

Marsh Posté le 22-10-2005 à 14:04:25    

Encore une fois, bravo!  :jap:  
J'avais aussi pensé à l'anti-slah mais j'avais essayé un_sousdossier\ et "un_sousdossier\"   :pfff:  
 
Donc tout est parfait!!
Et encore une fois merci.
 

olivthill a écrit :


Excuse-moi de ne pas m'être aperçu plus tôt du problème de l'anti-slash. :)


 
[Mode Dark Vador=ON]
 
Excuses acceptées général.
 
[Mode Dark Vador=OFF]
 
 :sol:  

Reply

Marsh Posté le 17-05-2006 à 16:54:44    

et c'est quoi la commande à la place de "deletefile" pour:
1. ouvrir
2. déplacer à un autre emplacement
 
merki de vos reponses

Reply

Marsh Posté le 02-06-2006 à 09:18:07    

Salut à tous. Et loué soit olivthill  :jap:  qui a réondu à mon problème sans que j'ai besoin de demander  :D  
 
Mais suite à ça justement j'avais une question à poser à olivthill comme à tous ceux qui peuvent me répondre.
 
J'ai rentré mon code pour la suppression de fichiers dans mon_programme_script.vbs, j ai fait le test tout marche.Mais je ne sais comment faire pour tester la date du fichier cible qui sera supprimer plus précisément le mois.(je ne parle pas du dossier car je ne veut pas supprimer les dossiers)Parce qu'en fait je dois faire un programme qui teste les date d'un fichier avec la date d'aujourd'hui, par exemple, et si le fichier est vieux de + d'un mois ca me le vire.  
 
(Par contre j'annonce je suis un gros noob en VBs et comme apr hasard jdois faire un script :cry:  alors je galère.)
 
J'en viens à ma question; comment puis-je faire pour récupérer dans une variable la date de mon fichier????Pour après la comparer avec la date d'aujourd'hui? Sachant que je n'ai besoin que du mois.  :cry:  
 
 (Je sais c'est fouilli mais je c'est pas comment synthétiser la question  :whistle: )  
 
P.S : Ne me donnez pas de lien internet svp, mais je demande pas qu'on me mache le travail non plus, juste me donner la commande qui appel la date du jour et la commande pour avoir la date du fichier.Après j'ai déjà fait l'algorithme donc je saurais faire mon script (normalement).


Message édité par naindjardin45 le 02-06-2006 à 09:19:48

---------------
Y a des jours où faut pas m'faire chier, y a des jours tous les jours!
Reply

Marsh Posté le 06-06-2006 à 14:25:58    

up


---------------
Y a des jours où faut pas m'faire chier, y a des jours tous les jours!
Reply

Marsh Posté le 08-06-2006 à 15:14:28    

mon probleme est résolu je n'ai eu besoin de personne  :D


---------------
Y a des jours où faut pas m'faire chier, y a des jours tous les jours!
Reply

Marsh Posté le 08-04-2009 à 22:43:51    

trop fort :D


---------------
Feed-Back @ir91  
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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