IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Récupération nouveaux fichiers dans arborescence de dossiers


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Par défaut Récupération nouveaux fichiers dans arborescence de dossiers
    Bonjour,

    J'ai 3 serveurs : SERV_SOURCE, SERV_TRANSFERT et SERV_DESTINATION.
    Sur SERV_SOURCE, j'ai une arborescence de dossiers et de fichiers ayant pour racine le dossier "RACINE".
    Sur SERV_DESTINATION, j'ai la même chose (une copie de cette arborescence).
    L'arborescence de SERV_SOURCE est amenée à être modifiée : mise à jour de certaines fichiers, création de nouveaux fichiers ou même création de nouveaux dossiers.
    Sur SERV_TRANSFERT, je dois écrire un script PowerShell qui récupère seulement les fichiers ou dossiers présents sur SERV_SOURCE, qui ne le sont pas sur SERV_DESTINATION, ainsi que le fichiers qui ont subit une mise à jour (ex: ajout de lignes dans un fichier .txt). Cela pour ensuite les transférer sur SERV_DESTINATION en respectant l'arborescence de SERV_SOURCE.

    En gros, je cherche à synchroniser l'arborescence présente sur SERV_DESTINATION avec celle présente sur SERV_SOURCE, en passant par SERV_TRANSFERT mais sans récupérer toute l'arborescence sur ce dernier (limitation d'espace disque sur SERVTRANSFERT oblige).

    N'ayant pour le moment écrit que de petit scripts Powershell, je sèche un peu et ne sait pas trop par où commencer...
    Si certains d'entre vous pouvait aiguiller mes recherches ce serait vraiment super sympa.
    Merci d'avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 281
    Par défaut
    salut sebastien4444

    il y a dans la galerie un script qui surveille les fichiers d'un serveur
    a toi de construire le code autour il doit sans doute y avoir des exemple quelque part

    sinon pour ce genre de manip on utilise plutot robocopy qui est tres bien

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Par défaut
    Bonjour 6ratgus et merci de ta réponse.

    En fait ce n'est pas vraiment cette partie qui me pose problème, car mon script sera planifié pour être exécuté toutes les minutes, je n'ai donc pas vraiment besoin de "trigger".
    Mon idée était plutôt, à chaque exécution du script, de faire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Je parcours l'arborescence de SERV_SOURCE, à chaque fichier/dossier rencontré, je vérifie si celui-ci est présent dans SERV_DESTINATION
         Si oui,
              Si c'est un fichier : je vérifie si la version de SERV_SOURCE est plus récente.
                   Si oui : je mémorise la place de ce fichier dans l'arborescence dans une variable (ex: $cheminFichier1 = "RACINE\dossier3\sous_dossier2\fichier1.txt") et je copie ce fichier sur SERV_TRANSFERT
                   Si non : je ne fais rien.
              Si c'est un dossier : je ne fais rien
         Si non,
              Je mémorise la place de ce fichier dans l'arborescence dans une variable et je copie ce fichier sur SERV_TRANSFERT
    Enfin, une fois tous mes nouveaux fichiers/dossiers copiés sur SERV_TRANSFERT, je copie chacun d'eux sur SERV_DESTINATION en faisant le rapprochement fichier/sa "variable chemin" pour savoir où je dois aller le ranger.
    Autant je n'aurai aucun mal à faire ça en java ou en php, mais en Powershell, je débute juste et il faut dire que je sèche un peu

    Par exemple, je sais parcourir un dossier avec "$dossier = Get-ChildItem -Path $chemin_dossier" et "foreach ($d in $dossier){}" mais je sais pas testé si l'élément rencontré est un fichier ou un dossier.
    Je ne sais pas non plus comparé les dates de modification de 2 fichiers.
    Par contre je sais testé si un dossier/fichier existe avec "$element = -TestPath $chemin_element" puis "If ($element -eq $True){}"

    Bref voilà, j'ai quelque bases mais il me manque des éléments pour transposer mon algo en script.

  4. #4
    Membre chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 281
    Par défaut
    ok je vois

    alors une simple info pour ce type de script : aucun soucis pour une petite arboresence, attention apres quelques dixaines de milliers de fichiers, les temps sont tres longs
    chez moi avec 1,3 millions de fichiers j'oubli !!

    pour get-childitem une vielle astuce pour connaitre le type d'objet (fichier/dossier)
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Get-ChildItem C:\temp -Recurse | foreach {
        if ($_.PSIsContainer) {
            "suis un dossier " + $_.fullname
            }
        else {
            "suis un fichier " + $_.fullname
            }
        }
    une autre approche puisque tout est objet dans powershell
    c'est de demander a n'avoir que les fichiers avec -file : Get-ChildItem C:\temp -Recurse -File
    et tu travail la propriété Directoryname qui te donne le nom du dossier ou ce trouve le fichier
    ex avec de la couleur :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Get-ChildItem C:\temp -file -Recurse | foreach {
           Write-Host -f Cyan  -NoNewline $_.Name
           Write-Host -f White -NoNewline " suis dans le dossier "
           Write-Host -f Green $_.Directoryname
        }

    pour info la liste des dossier get-childitem -Directory

    pour testé la presence d'un fichier ou dossier tu a test-path
    $variable = "C:\windows"
    if (Test-Path $variable) {
    "$variable est present !!"
    }
    else {
    "pas de $variable"
    }


    pour les dates la propriétés est LastWriteTime de type datetime
    la comparaison de tout objet (date comprise) ce fait par -eq pour egale, -gt pour strictement plus grand, -ge pour plus ou egale, idem pour inferrieur -le -lt

    ex :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $date_du_jour = Get-Date
    $fichier = Get-ChildItem "C:\Windows\write.exe"
    if ($fichier.LastWriteTime -lt $date_du_jour) {
        "write ne date pas d'aujourd'hui"
        }

    je suis pas sur que la date strictement identique apres une copie mais tu vera avec tes tests

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Pourquoi passer par un SERV_TRANSFERT intermédiaire ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Si c'est pour l'exécuter toutes les minutes, autant qu'il soit résident et utiliser la classe FileSystemWatcher pour obtenir les modifications en live.
    Surtout qu'il mettra peut être plus d'une minute à s'exécuter.

Discussions similaires

  1. Réponses: 26
    Dernier message: 26/03/2010, 15h24
  2. [Batch] Lister les fichiers dans en un dossier et dossier enfant avec arborescence
    Par Sparktacus dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 30/11/2009, 14h16
  3. Récupération de fichiers dans une arborescence
    Par bibilolo2 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 04/05/2007, 22h19
  4. rechercher des fichiers dans tous les dossiers
    Par nitteo dans le forum MFC
    Réponses: 4
    Dernier message: 23/06/2006, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo