Dji-Pih | Bonjour à tous, Pour ceux que cela intéresse, voici un VBScript facilitant l'utilisation de robocopy Version XP010 pour lister, copier, déplacer ou synchroniser des fichiers : Code :
- '-------------------------------------------------------------
- ' Utilitaire : ROBOCOPY22.vbs (version 2.2)
- ' But Ial: Faciliter et automatiser l'utilisation de la commande DOS robocopy.exe.
- ' Cet utilitaire sera utilisé essentiellement pour analyser et purger les fichiers
- ' utilisateurs sur le serveur de fichiers.
- ' But IIaire : approfondir le langage de script VBS
- ' Installation : 1/ Ce script sur le bureau du serveur de fichier
- ' 2/ robocopy.exe XP010 (Ressource Kit XP) dans le répertoire %windir%
- ' Auteur : J.Philippe SOSSON
- ' Versions 1.0 Menu + options de base : copier, déplacer, lister, synchroniser,
- ' critères selon la taille des fichiers, date de modification
- ' 2.0 * Optimisation du code : Fonctions, procédures, tableaux et constantes
- ' * Ajout du critère selon la date d'accès
- ' * Correction de la fonction Mirroir : /MIR ne fonctionne pas avec l'option /XX
- ' 2.1 * Ajout de l'option R) pour répéter la dernière commande
- ' * Modification de la sortie de l'utilitaire
- ' 2.2 * Ajout de la gestion des messages en sortie de robocopy
- ' * Ajout d'un filtre sur les fichiers
- '-------------------------------------------------------------
- '------ Déclaration des variables et des constantes
- Option Explicit '------ Forcer la déclaration des variables
- Dim wsh, fso, FichierJournal
- Const C_Lecture = 1, C_Ecriture = 2
- Const C_FichierJournal = "c:\robocopy.txt"
- Dim CmdeRobocopy
- Dim ChoixMenu
- Dim SaisieDossier, SaisieFichier, SaisieDate, SaisieTaille, Validation
- Dim T_SelectionDossier(1)
- Const C_DossierSource = 0, C_DossierDestination = 1
- Dim T_SelectionDate(1, 3)
- Const C_DateOption = 0, C_DateTexte = 1
- Const C_DateAccesAnterieure = 0, C_DateAccesPosterieure = 1, C_DateModificationAnterieure = 2, C_DateModificationPosterieure = 3
- Dim T_SelectionTaille(1, 1)
- Const C_TailleOption = 0, C_TailleTexte = 1
- Const C_TailleMin = 0, C_TailleMax = 1
- Dim CodeRetour, Bit, T_MessageRetour(5)
- '------ Déclaration des fonctions et procédures
- Function SelectionDossier(TypeDossier)
- Do
- SaisieDossier = InputBox("Dossier" & T_SelectionDossier(TypeDossier), "ROBOCOPY" )
- Loop Until fso.FolderExists(SaisieDossier)
- SelectionDossier = " " & SaisieDossier
- End Function
- Function SelectionFichier()
- SaisieFichier = InputBox("Tri sur les fichiers" & Chr(10) & "Caratères génériques acceptés, *.* par défaut", "ROBOCOPY" )
- If Len(SaisieFichier) > 0 Then
- SelectionFichier = " " & SaisieFichier
- End If
- End Function
- Function ChoixDate()
- '------ Filtre sur les dates d'accès OU les dates de modification
- If MsgBox("Souhaitez-vous trier les fichiers sur les dates d'accès", vbYesNo + vbQuestion, "ROBOCOPY" ) = vbYes Then
- ChoixDate = SelectionDate(C_DateAccesAnterieure)
- ChoixDate = ChoixDate & SelectionDate(C_DateAccesPosterieure)
- Else
- If MsgBox("Souhaitez-vous trier les fichiers sur les dates de modification", vbYesNo + vbQuestion, "ROBOCOPY" ) = vbYes Then
- ChoixDate = SelectionDate(C_DateModificationAnterieure)
- ChoixDate = ChoixDate & SelectionDate(C_DateModificationPosterieure)
- End If
- End If
- End Function
- Function SelectionDate(TypeDate)
- Do
- Validation = 0
- SaisieDate = InputBox("Fichiers dont la date" & T_SelectionDate(C_DateTexte, TypeDate) & Chr(10) _
- & "Bouton [Annuler] si aucune, sinon JJ/MM/AAAA", "ROBOCOPY" )
- If Len(SaisieDate) = 0 Then
- Validation = vbYes
- Else
- if Len(SaisieDate) = 10 Then
- If IsNumeric(Right(SaisieDate,4)) And IsNumeric(Mid(SaisieDate,4,2)) And IsNumeric(Left(SaisieDate,2)) Then
- Validation = MsgBox("Veuillez confirmer : fichiers dont la date" _
- & T_SelectionDate(C_DateTexte, TypeDate) & " à " & SaisieDate, vbYesNo + vbExclamation, "ROBOCOPY" )
- If Validation = vbYes Then
- SaisieDate = Right(SaisieDate,4) & Mid(SaisieDate,4,2) & Left(SaisieDate,2)
- SelectionDate = T_SelectionDate(C_DateOption, TypeDate) & SaisieDate
- End If
- End If
- End If
- End If
- Loop Until Validation = vbYes
- End Function
- Function ChoixTaille()
- If MsgBox("Souhaitez-vous trier les fichiers sur la taille", vbYesNo + vbQuestion, "ROBOCOPY" ) = vbYes Then
- ChoixTaille = SelectionTaille(C_TailleMin)
- ChoixTaille = ChoixTaille & SelectionTaille(C_TailleMax)
- End If
- End Function
- Function SelectionTaille(TypeTaille)
- Do
- Validation = 0
- SaisieTaille = InputBox("Fichiers dont la taille est" & T_SelectionTaille(C_TailleTexte, TypeTaille) & Chr(10) _
- & "Bouton [Annuler] si aucune, sinon X (en Go)", "ROBOCOPY" )
- If Len(SaisieTaille) = 0 Then
- Validation = vbYes
- Else
- If IsNumeric(SaisieTaille) Then
- Validation = MsgBox("Veuillez confirmer : fichiers dont la taille est" _
- & T_SelectionTaille(C_TailleTexte, TypeTaille) & " à " & SaisieTaille & " Go" _
- , vbYesNo + vbExclamation, "ROBOCOPY" )
- If Validation = vbYes Then
- SelectionTaille = T_SelectionTaille(C_TailleOption, TypeTaille) & Cstr(Clng(SaisieTaille)*1024*1024)
- End If
- End If
- End If
- Loop Until Validation = vbYes
- End Function
- Function Journal()
- Journal = " /LOG:c:\robocopy.log /NDL" 'Fichier journal et contenu
- If MsgBox("Souhaitez-vous un affichage de l'exécution de la commande dans la console windows" _
- , vbYesNo + vbQuestion, "ROBOCOPY" ) = vbYes Then
- Journal = Journal & " /ETA /TEE"
- End If
- End Function
- Sub ArchiveCommande(CmdeRobocopy, TypeAcces)
- Set FichierJournal = fso.OpenTextFile(C_FichierJournal, TypeAcces, True)
- If TypeAcces = C_Lecture Then
- CmdeRobocopy = FichierJournal.ReadLine
- Else
- FichierJournal.WriteLine CmdeRobocopy
- End If
- FichierJournal.Close
- End Sub
-
- Function MessageRetour(CodeRetour)
- If CodeRetour = 0 Then
- MessageRetour = T_MessageRetour(5)
- Else
- For Bit = 0 To 4
- If (CodeRetour And (2^Bit)) = (2^Bit) Then
- MessageRetour = MessageRetour & T_MessageRetour(Bit)
- End If
- Next
- End If
- End Function
-
- Sub ExecuteCommande(CmdeRobocopy)
- If MsgBox("Souhaitez-vous exécuter la commande suivante :" & Chr(10) _
- & CmdeRobocopy, vbYesNo + vbExclamation, "ROBOCOPY" ) = vbYes Then
- CodeRetour = wsh.Run(CmdeRobocopy, 1, True) '------ Execution avec attente de la fin de la commande
- MsgBox MessageRetour(CodeRetour), vbOKOnly, "ROBOCOPY"
- wsh.Run("notepad.exe c:\robocopy.log" ) '------ Ouverture du fichier journal
- ArchiveCommande CmdeRobocopy, C_Ecriture
- End If
- End Sub
- '------ Initialisation des variables
- Set wsh = CreateObject("WScript.Shell" )
- Set fso = CreateObject("Scripting.FileSystemObject" )
- T_SelectionDossier(C_DossierSource) = " Source"
- T_SelectionDossier(C_DossierDestination) = " Destination"
- T_SelectionDate(C_DateOption, C_DateAccesAnterieure) = " /MINLAD:"
- T_SelectionDate(C_DateOption, C_DateAccesPosterieure) = " /MAXLAD:"
- T_SelectionDate(C_DateOption, C_DateModificationAnterieure) = " /MINAGE:"
- T_SelectionDate(C_DateOption, C_DateModificationPosterieure) = " /MAXAGE:"
- T_SelectionDate(C_DateTexte, C_DateAccesAnterieure) = " d'accès est antérieure"
- T_SelectionDate(C_DateTexte, C_DateAccesPosterieure) = " d'accès est postérieure"
- T_SelectionDate(C_DateTexte, C_DateModificationAnterieure) = " de modification est antérieure"
- T_SelectionDate(C_DateTexte, C_DateModificationPosterieure) = " de modification est postérieure"
- T_SelectionTaille(C_TailleOption, C_TailleMin) = " /MIN:"
- T_SelectionTaille(C_TailleOption, C_TailleMax) = " /MAX:"
- T_SelectionTaille(C_TailleTexte, C_TailleMin) = " supérieure"
- T_SelectionTaille(C_TailleTexte, C_TailleMax) = " inférieure"
- T_MessageRetour(0) = "Un ou plusieurs fichiers ont été copiés avec succès. "
- T_MessageRetour(1) = "Certains fichiers ou dossiers sont en EXTRA (Absent de la source, mais présent dans la destination). " & _
- "Visualiser le fichier journal afin d'effectuer des opérations si nécessaire (sauf en cas de listage). "
- T_MessageRetour(2) = "Certains fichiers ou dossiers sont en dissonance. Visualiser le fichier journal afin d'effectuer des opérations si nécessaire. "
- T_MessageRetour(3) = "Certains fichiers ou dossiers n'ont pas pu être copiés (malgré le nombre et le délai des reprises spécifiés). "
- T_MessageRetour(4) = "Erreur sérieuse. Robocopy n'a copié aucun fichier. C'est une erreur d'utilisation de la commande " & _
- "ou une erreur due aux privilèges d'accès insuffisants sur les dossiers sources ou destinations. "
- T_MessageRetour(5) = "Aucune erreur et aucune copie : les dossiers sources et destinations sont synchronisés. "
- '------ MAIN ------
- Do
- CmdeRobocopy = "ROBOCOPY"
- '------ CHOIX DE L'ACTION ------
- ChoixMenu = UCase(InputBox("Votre choix :" & Chr(10) & Chr(10) _
- & "C) Copier des fichiers" & Chr(10) _
- & "D) Déplacer des fichiers" & Chr(10) _
- & "L) Lister des fichiers" & Chr(10) _
- & "M) Synchroniser des fichiers (Mirroir)" & Chr(10) _
- & "R) Répéter la dernière commande" & Chr(10) _
- & Chr(10) & "Bouton [Annuler] ou [Entrée] sans valeur pour Quitter" _
- ,"ROBOCOPY" ))
- Select Case ChoixMenu
- Case "C" '------ Copier des fichiers
- CmdeRobocopy = CmdeRobocopy & SelectionDossier(C_DossierSource)
- CmdeRobocopy = CmdeRobocopy & SelectionDossier(C_DossierDestination)
- CmdeRobocopy = CmdeRobocopy & SelectionFichier()
- CmdeRobocopy = CmdeRobocopy & ChoixDate()
- CmdeRobocopy = CmdeRobocopy & ChoixTaille()
- CmdeRobocopy = CmdeRobocopy & " /COPYALL /S /ZB" '------ Action a réaliser
- CmdeRobocopy = CmdeRobocopy & " /R:3 /W:60" '------ Nombre et délai pour une reprise de l'action en cas d'échec
- CmdeRobocopy = CmdeRobocopy & Journal()
- ExecuteCommande CmdeRobocopy
- Case "D" '------ Déplacer des fichiers
- CmdeRobocopy = CmdeRobocopy & SelectionDossier(C_DossierSource)
- CmdeRobocopy = CmdeRobocopy & SelectionDossier(C_DossierDestination)
- CmdeRobocopy = CmdeRobocopy & SelectionFichier()
- CmdeRobocopy = CmdeRobocopy & ChoixDate()
- CmdeRobocopy = CmdeRobocopy & ChoixTaille()
- CmdeRobocopy = CmdeRobocopy & " /COPYALL /S /ZB /MOVE" '------ Action a réaliser
- CmdeRobocopy = CmdeRobocopy & " /R:3 /W:60" '------ Nombre et délai pour une reprise de l'action en cas d'échec
- CmdeRobocopy = CmdeRobocopy & Journal()
- ExecuteCommande CmdeRobocopy
- Case "L" '------ Lister des fichiers
- CmdeRobocopy = CmdeRobocopy & SelectionDossier(C_DossierSource)
- CmdeRobocopy = CmdeRobocopy & " C:\" '------ Destination bidon car listage uniquement...
- CmdeRobocopy = CmdeRobocopy & SelectionFichier()
- CmdeRobocopy = CmdeRobocopy & ChoixDate()
- CmdeRobocopy = CmdeRobocopy & ChoixTaille()
- CmdeRobocopy = CmdeRobocopy & " /COPY:D /S /L /XX" '------ Action a réaliser
- CmdeRobocopy = CmdeRobocopy & " /R:0 /W:0" '------ Nombre et délai pour une reprise de l'action en cas d'échec
- CmdeRobocopy = CmdeRobocopy & Journal()
- ExecuteCommande CmdeRobocopy
- Case "M" '------ Synchroniser des fichiers (Mirroir)
- CmdeRobocopy = CmdeRobocopy & SelectionDossier(C_DossierSource)
- CmdeRobocopy = CmdeRobocopy & SelectionDossier(C_DossierDestination)
- CmdeRobocopy = CmdeRobocopy & " /COPYALL /E /ZB /MIR" '------ Action a réaliser
- CmdeRobocopy = CmdeRobocopy & " /R:3 /W:60" '------ Nombre et délai pour une reprise de l'action en cas d'échec
- CmdeRobocopy = CmdeRobocopy & Journal()
- ExecuteCommande CmdeRobocopy
- Case "R" '------ Répéter la dernière commande
- If fso.FileExists(C_FichierJournal) Then
- ArchiveCommande CmdeRobocopy, C_Lecture
- ExecuteCommande(CmdeRobocopy)
- Else
- MsgBox "Commande Impossible : c:\robocopy.txt est introuvable...", vbOKOnly, "ROBOCOPY"
- End If
- Case "" '------ Quitter par le bouton [Annuler] ou [Entrée] sans valeur
- If MsgBox("Confirmation de l'abandon de l'utilitaire", vbYesNo + vbQuestion, "ROBOCOPY" ) = vbNo Then
- ChoixMenu = "On ne quitte pas la procédure"
- End If
- Case Else
- MsgBox "Choix de menu incorrect...", vbOKOnly, "ROBOCOPY"
- End Select
- Loop Until Len(ChoixMenu) = 0
| |