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 :

copie fichiers en fonction de la date de modification


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Homme Profil pro
    technicien système et réseau
    Inscrit en
    Octobre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : technicien système et réseau

    Informations forums :
    Inscription : Octobre 2018
    Messages : 5
    Par défaut copie fichiers en fonction de la date de modification
    Bonjour,

    je débute en script powershell et j'aurai besoin de vos lumières s'il vous plait.
    je voudrais créer un script qui me copierais les fichiers plus récent se trouvant dans un répertoire A que le celui dans le répertoire B en fonction de la date de modification.

    je précise que j'ai des fichiers de deux formats dans les deux répertoires, mais mon format de comparaison sera avec un fichier .log
    tous les 2 jours je dois copier des fichiers du répertoire A vers B, d'un répertoire C vers D ...etc une fois le premier trouvé je ferais le reste seul pour apprendre encore :)
    le nombre de fichiers a copier varie en fonction des jours, je ne peux donc pas me baser sur cela, d’où mon point de comparaison avec la date de modification

    j'espère avoir été assez clair, n'hésitez pas a me poser des questions si cela ne l'ai pas

    je vous mets mes lignes de commande
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $sourcelog = "C:\Users\thomass\Documents\Ancien_dossier\*.log"
    $destination = "C:\Users\thomass\Documents\nouveau_dossier\"
    $sourcebak = "C:\Users\thomass\Documents\Ancien_dossier\*" 
    $Fichiers = Get-ChildItem $sourcebak
    $File=Get-ChildItem "C:\Users\thomass\Documents\nouveau_dossier\*.log" 
    $date = $File.LastWriteTime 
    Write-Host $date
     
    Foreach ($Fichier in Get-ChildItem $sourcebak) {
        if ($Fichier.creationTime -ge $date )
       {
            Copy-Item -Path $Fichier.FullName -Destination $destination
            Write-Host 'Le fichier' $Fichier 'a été copié'
            }
           }

    mais j’obtiens plusieurs erreur de ce type :
    Impossible de comparer «10/04/2018 15:41:51» avec «10/08/2018 15:39:03 10/04/2018 18:20:12». Erreur: «Impossible de 
    convertir la valeur «System.Object[]» du type «System.Object[]» en type «System.DateTime».»
    Au caractère Ligne:15 : 9
    +     if ($Fichier.creationTime -ge $date )
    +         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
        + FullyQualifiedErrorId : ComparisonFailure
    j'ai également essayé via un pipe mais j'obtiens le même message d'erreur
    je sais que cela est dut a mon point de comparaison avec les dates de modification mais je bloque sur ce point..


    merci pour votre aide

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    depuis la version 3 de powershell (si je me souviens bien) il existe l'itération automatique sur des collections (tableau) :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $File.Count
    $File.GetType().FullName
     
    $File[0].LastWriteTime 
    $File[0].GetType().FullName

  3. #3
    Membre à l'essai
    Homme Profil pro
    technicien système et réseau
    Inscrit en
    Octobre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : technicien système et réseau

    Informations forums :
    Inscription : Octobre 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Salut,
    depuis la version 3 de powershell (si je me souviens bien) il existe l'itération automatique sur des collections (tableau) :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $File.Count
    $File.GetType().FullName
     
    $File[0].LastWriteTime 
    $File[0].GetType().FullName
    Bonjour Laurent et merci pour votre réponse,

    je suis entrain de me renseigner sur l'itération automatique même si j'ai un peu de mal a trouver...
    ce que vous avez mit, je dois le remplacer a la place de mon foreach ?
    car j'aimerai comprendre ce que je fais et non juste copier les réponses

    EDIT: j'essai par un autre moyen en intégrant ce que vous m'avez cité, j'ai également vu que j'avais un fichier en backupXXX.vbm qui se met a jours tous les jours j'ai voulu me basé dessus pour la derniere date de modification et j'arrive a ressortir la bonne date,
    il me copie bien le fichier plus récent que lui mais me copie également 3 autre fichier avec une date de modification plus ancienne et juste ces 3 la; et la je ne comprends pas pourquoi.
    je mets les lignes de code que j'ai entré puis le résultat.

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $sourcelog = "C:\Users\thomass\Documents\Ancien_dossier\*.log"
    $destination = "C:\Users\thomass\Documents\nouveau_dossier\"
    $sourcebak = "C:\Users\thomass\Documents\Ancien_dossier\*" 
    $Fichiers = Get-ChildItem $sourcebak
    $File=Get-ChildItem "C:\Users\thomass\Documents\nouveau_dossier\backup*.vbm"
    $date = $File.LastWriteTime 
    Write-Host $date
     
     
    $File.Count
    $File.GetType().FullName 
    $File[0].LastWriteTime 
    $File[0].GetType().FullName
     
     
    # pour la copie des fichiers
     
    Foreach ($Fichier in Get-ChildItem $sourcebak) {
        if ($Fichier.creationTime -ge $File[0].LastWriteTime)
       {
            Copy-Item -Path $Fichier.FullName -Destination $destination
            Write-Host 'Le fichier' $Fichier 'a été copié'
            }
           }

    le résultat :

    PS C:\Users\thomass\Desktop> C:\Users\thomass\Desktop\script_veembackup.ps1
    08/10/2018 16:47:00
    1
    System.IO.FileInfo

    lundi 8 octobre 2018 16:47:00
    System.IO.FileInfo
    Le fichier C:\Users\thomass\Documents\Ancien_dossier\Backup dossier.vbm a été copié fichier plus récent donc ok
    Le fichier C:\Users\thomass\Documents\Ancien_dossier\ddddd.bak a été copié fichier plus ancien NOK
    Le fichier C:\Users\thomass\Documents\Ancien_dossier\eeeee.bak a été copié fichier plus ancien NOK
    Le fichier C:\Users\thomass\Documents\Ancien_dossier\fffff.bak a été copié fichier plus ancien NOK

    J'ajoute une photo de mes dossiers de test pour comprendre un peu mieux avec une visu des dates de modifications

    Nom : 2018-10-09 17_24_13-[PowerShell] copie fichiers en fonction de la date de modification - Modifie.jpg
Affichages : 5613
Taille : 133,8 Ko

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mistert59 Voir le message
    je suis entrain de me renseigner sur l'itération automatique même si j'ai un peu de mal a trouver...
    Il faut lire les releases notes des différents version. ici ceux de la version 3 :
    You can access the properties of underlying objects in an array.

    In Windows PowerShell 2.0, because the array does not have the property, no values are returned. # Access properties of underlying objects
    $p = Get-Process
    $p.Name

    # Windows PowerShell 2.0 returns $null.
    # Windows PowerShell 3.0 returns process names
    Citation Envoyé par mistert59 Voir le message
    ce que vous avez mis, je dois le remplacer à la place de mon foreach ?
    Non, il s'agit de code mettant en évidence le fait que l'objet est un tableau. Enfin si ma déduction est juste :-)
    Dans ton cas crée un jeu de test avec quelques fichiers.

  5. #5
    Membre à l'essai
    Homme Profil pro
    technicien système et réseau
    Inscrit en
    Octobre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : technicien système et réseau

    Informations forums :
    Inscription : Octobre 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Il faut lire les releases notes des différents version. ici ceux de la version 3 :


    Non, il s'agit de code mettant en évidence le fait que l'objet est un tableau. Enfin si ma déduction est juste :-)
    Dans ton cas crée un jeu de test avec quelques fichiers.
    c'est ce que j'ai fait, et j'ai réussi !!! Merci !!!

    Voici le codage

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $sourcelog = "C:\Users\thomass\Documents\Ancien_dossier\*.log"
    $destination = "C:\Users\thomass\Documents\nouveau_dossier\"
    $sourcebak = "C:\Users\thomass\Documents\Ancien_dossier\*" 
    $File=Get-ChildItem "C:\Users\thomass\Documents\nouveau_dossier\*.bak" |Select-Object -Last 1
     
    $File.Count
    $File.GetType().FullName 
    $File[0].LastWriteTime 
    $File[0].GetType().FullName
     
    # pour la copie des fichiers
     
    $Fichiers = Get-ChildItem $sourcebak |where-object {($_.LastWriteTime -ge $File[0].LastWriteTime ) }
    copy-Item -Path $Fichiers -Destination $destination -WhatIf
    Write-Host 'Le(s) fichier(s)' $Fichiers 'a(ont) été copié(s)'

    par contre j'ai voulu le faire sur un powershell 2 et j'ai effectivement le problème que cela me renvois nul en valeur
    car j'ai un peu prés la même chose a faire sur un serveur plus ancien.

    serais tu pars quoi je pourrais donc remplacer cela pour qu'en powershell 2 cela soit compatible ?

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mistert59 Voir le message
    serais tu par quoi je pourrais donc remplacer cela pour qu'en powershell 2 cela soit compatible ?
    Par ceci, en reprenant l'exemple donné précédemment :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $Names=@(Get-Process|Select-object -ExpandProperty Name)
    # ou encore
    $Names=@(Get-Process|Foreach-object {$_.Name})
    Avec le @() tu es assuré d'obtenir un tableau de zéro, 1 ou n éléments.

  7. #7
    Membre à l'essai
    Homme Profil pro
    technicien système et réseau
    Inscrit en
    Octobre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : technicien système et réseau

    Informations forums :
    Inscription : Octobre 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Par ceci, en reprenant l'exemple donné précédemment :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $Names=@(Get-Process|Select-object -ExpandProperty Name)
    # ou encore
    $Names=@(Get-Process|Foreach-object {$_.Name})
    Avec le @() tu es assuré d'obtenir un tableau de zéro, 1 ou n éléments.
    J'ai essayé plusieurs chose mais je ne vois toujours pas ou je peux mettre la ligne de commande, ni ce que je dois enlever...
    d'ailleurs je ne la comprends pas trop

Discussions similaires

  1. supprimer des fichiers en fonction de la date de modification
    Par jujudeo dans le forum Général Python
    Réponses: 5
    Dernier message: 03/06/2016, 11h21
  2. [Batch] Script selection de fichiers en fonction de la date de modification
    Par jlouedoc dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 11/02/2015, 14h56
  3. Copie fichiers en fonction des dates modif
    Par keely dans le forum VBScript
    Réponses: 3
    Dernier message: 27/02/2011, 14h05
  4. suppression fichier en fonction d'une date
    Par kalyparker dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 02/07/2007, 14h19
  5. Script de suppression de fichiers en fonction de la date
    Par yellow174 dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 06/02/2006, 11h57

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