Tatiak

Excel, Guitare, New- Beetle, ... et netbook ...

29 novembre 2008

Synchronisation Dossiers et Sous-Dossier - VBScript

Avant propos : Et non ce n'est pas du VBA pour Excel, mais du VBS qui "marche tout seul" ;)

Pour faire suite à mon post précédent, et pour aller plus loin dans les contraintes, voici la version suivante du script de synchronisation. En effet, le point "faible" du script précédent est qu'il ne traitait pas les sous-répertoires du dossier choisi.
Voici donc un outil plus complet, capable de traiter les fichiers, les sous répertoires et les fichiers des sous répertoires d'un dossier quelconque à choisir.

Téléchargement de : Synchronisation_DOSSIERS.zip

Dans le code, vous remarquerez 2 fonctions qui sont le "moteur" de l'outil. Une première liste les fichiers du dossier "source" :
Function ListerDossier(Chemin)
Dim Fso, SousRepertoire, SousFichier, SousFichierItem
    if right(Chemin, 1) <> "\" then Chemin = Chemin & "\"
    On Error Resume Next
    Set Fso = CreateObject("Scripting.FileSystemObject")
    For Each SousRepertoire In Fso.GetFolder(Chemin).SubFolders
        ListerDossier SousRepertoire.Path
    Next
    For Each SousFichier In Fso.GetFolder(Chemin).Files
        Set SousFichierItem = Fso.GetFile(SousFichier)
        nbfichiers = nbfichiers +1
        ReDim Preserve Tableau(3, nbfichiers)
        Tableau(1, nbfichiers) = replace (Chemin, Chemin1 , "")
        Tableau(2, nbfichiers) = SousFichier.Name
        Tableau(3, nbfichiers) = SousFichierItem.DateLastModified
    next
End Function

L'autre fonction liste le contenu du dossier "cible" et effectue le traitement de copie et de mise à jour du contenu de la "source" et de la "cible" :
Function ComparerFichier(Chemin)
Dim Fso, SousRepertoire, SousFichier, SousFichierItem
    if right(Chemin, 1) <> "\" then Chemin = Chemin & "\"
    On Error Resume Next
    Set Fso = CreateObject("Scripting.FileSystemObject")
    For Each SousRepertoire In Fso.GetFolder(Chemin).SubFolders   
        if not Fso.FolderExists(Chemin1 & sousrepertoire.name) then Fso.CreateFolder (Chemin1 & sousrepertoire.name)       
        ComparerFichier SousRepertoire.Path
    Next
    for i = 1 to nbfichiers
        For Each SousFichier In Fso.GetFolder(Chemin).Files
            Set SousFichierItem = Fso.GetFile(SousFichier)   
            if not Fso.FileExists(Chemin1 & replace(Chemin, Chemin2, "") & SousFichier.name) then
                Fso.CopyFile Chemin & SousFichier.Name ,  Chemin1 & replace(Chemin, Chemin2, ""), true   
            end if
            if tableau(1,i) = replace(Chemin, Chemin2, "") and tableau(2,i) = SousFichier.name then
                If CDate(tableau(3,i)) > CDate(SousFichierItem.DateLastModified) Then
                    Fso.CopyFile Chemin1 & replace(Chemin, Chemin2, "") & tableau(2,i) ,  Chemin2 & replace(Chemin, Chemin2, ""), true
                else
                    Fso.CopyFile Chemin2 & replace(Chemin, Chemin2, "") & tableau(2,i) ,  Chemin1 & tableau(1,i) , true
                end if
            end if
        next
        if  not Fso.FileExists(Chemin2 & tableau(1,i) & tableau(2,i)) then
            Fso.CopyFile Chemin1 & tableau(1,i) & tableau(2,i) ,  Chemin2 & tableau(1,i), true
        end if
    next
End Function

Voilà tout, n'hésitez pas à me faire part de vos remarques si vous trouvez un bug!
:) tatiak

Posté par tatiak à 12:20 - Excel - Commentaires [7] - Permalien [#]

Commentaires

    Besoin de +

    Re Tatiak,

    J'ai bien collé ton *vbs dans un module
    J'ai bien fait appel de la fonction en B1 par =listerdossier(A1) et mis le chemin en A1 (C:\Documents and Settings\JCGL\Mes documents\Telechargement).

    Il doit me manquer un bout de compréhension...
    Merci et A++ mon ami

    Posté par JCGL, 29 novembre 2008 à 17:09
  • Oula!

    Hello mon ami!!
    L'affaire est bien plus simple! Nul besoin de coller ce code dans quelque module que se soit : ça marche tout seul grâce à WSH (windows Scripting Host). Il suffit donc de dézipper l'archive à télécharger et de double-cliquer dessus (sous ouindose of course).
    En fait le VBScript sert (peut servir) à l'administration système en direct.
    J'ai bon, j'ai bon???
    tatiak

    Posté par tatiak, 29 novembre 2008 à 17:22
  • Re mon ami,

    Merci pour ton MP.
    Je t'invite à déposer ICI que c'est automatique au clique sur le VBS....

    Je dois être trop imprégné VB...
    A++ et Merci de ton retour (et de ton complément d'explications dans ton message... ARF et Niark

    Encore Bravo

    Posté par JCGL, 29 novembre 2008 à 17:50
  • Re,

    Merci de ta précision sur le VBS "qui marche tout seul".

    Je suis trop imprégné du VBA. Il y en a tant d'autres

    A++ mon ami

    Posté par JCGL, 29 novembre 2008 à 18:36
  • Chemin d'accès introuvable

    Bonjour,


    Un petit message d'erreur avec "Fso.CreateFolder"
    --------------------------
    if not Fso.FolderExists(Chemin2 & tableau(1,i)) then Fso.CreateFolder (Chemin2 & tableau(1,i))

    Ligne : 24
    caractère : 58
    Erreur : chemin d'accès introuvable
    Code : 800A004C
    Source : Erreur d'exécution Microsoft VBScript

    Posté par Billcourroie, 16 octobre 2009 à 16:52
  • Ce n'est qu'une démo!

    Bonjour,
    Merci de l'intérêt que vos portez à ces petits exemples de code. En effet, dans cette démo, il n'y a pas de gestion d'erreurs (ou presque) et tout reste à faire.
    A minima vous pouvez ajouter juste avant la ligne posant souci, la ligne suivante :
    on error resume next
    Ce qui, au moins, permettra au programme de passer à la ligne suivante sans bloquer.
    Pour une applic vraiment performante, je vous renvoie à bon nombre de soft qu'il est possible de trouver gratuitement sur internet. Les codes de mon blog sont plus des penses-bête qu'autre chose.
    Cordialement
    tatiak

    Posté par tatiak, 19 octobre 2009 à 18:38
  • Grand merci

    Bonjour,
    Tout d'abord, je tien à vous remercier pour ce script génial.
    N'étant pas connaisseur en vbs, j'ai fait un script de syncro en ROBOCOPY avec l'option /MIR. ce script s'exécute à la fermeture de session réseau. Le défaut de ce script est qu'il est monodirectionnelle source--> destination

    Source: C\users\%USER%\Documents
    Destination \\SERVEUR\users\%USER%\Documents

    J'ai deux petite question:
    1) Comment intégrer ma source et ma destination dans votre script pour l'exécuter sans intervention de la part de l'utilisateur.

    2) est-il possible de de faire en sorte que si un dossier ou un fichier est supprimé dans la Source qu'il soit supprimé dans la destination aussi.

    Par avance merci

    Mahdi
    m.aburayyan@xiring.com
    m.aburayyan@xiring.com

    Posté par Mahdi, 12 août 2011 à 10:24

Poster un commentaire