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 :

Gestion de copie de fichiers avec PowerShell


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 17
    Points
    17
    Par défaut Gestion de copie de fichiers avec PowerShell
    Bonjour, ou plutôt bonsoir..
    Je suis vraiment pas doué en PowerShell, ni en autre langage de programmation d’ailleurs, mais j'essaie d'apprendre.
    Mais Là je suis confronté un gros problème, j'explique :

    Dans le cadre d'une mission je dois faire un tri de fichiers présents sur plusieurs serveurs de fichiers, j'ai fait une extraction en format excel de chaque serveur.
    Chaque feuille excel contient la dernière date d’accès, de modification, de création, l’extension, le nom et le chemin des fichiers à traiter.( il y a 3 Teras de fichiers)

    C'est là que je bloque depuis deux jours.
    Je voulais me servir de cette feuille excel pour faire un script pour trier les fichiers par date de dernier accès, puis les déplacer vers un autre endroit en conservant l'arborescence du répertoire d'origine.

    j'ai fait divers tests avec Robocopy, puis d'autres commande mais j'arrive à rien, sauf a faire la copie intégrale des répertoires...... mais je n'arrive même pas a convertir mon fichier .xls en .csv.

    A l'aide s'il vous plait!!!!!

    Merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    j'ai fait une extraction en format excel de chaque serveur
    Pourquoi tu te met des battons dans les roues ? Fait directement une extraction en csv.
    Au pire fait cette conversion manuellement, ça ne semble pas être une opération récurrente.


    Je voulais me servir de cette feuille excel pour faire un script pour trier les fichiers par date de dernier accès, puis les déplacer vers un autre endroit en conservant l'arborescence du répertoire d'origine.
    Un tri n'a jamais été un filtre tu aura donc tous les fichiers, du coup quelle est l’intérêt de cette opération ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 17
    Points
    17
    Par défaut
    Bonjour et merci de me répondre,
    l'extraction avec excel avait pour but de pouvoir lister les données et les volumes, car le but de tout ça est de faire un tri des fichiers présents sur les serveurs par date de dernier accès. je n'avais aucune infos sur les volumes a traiter, j'ai donc pensé a cette solution.
    Je voulais par la suite utiliser ces feuilles excel pour faire un script qui récupérerai les fichiers antérieurs a une date donnée et qui les déplacerai dans un autre répertoire d'archive en conservant l’arborescence. le but final étant de faire de la place et de migrer les fichiers récents sur un autre serveur.

    Je voulait utiliser PowerShell pour gagner du temps car pour utiliser un logiciel qui fait tout ça il me faut passer par les SI et cela va prendre beaucoup de temps.
    j'ai réussi à faire une copie complète des répertoires en conservant l'arborescence, mais pour le tri par date d'accès ou de modification je cale lamentablement.

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Un début de code pour filtrer directement sur les fichiers ayant été accédées avant une date.
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    Get-ChildItem -Path "C:\ericlm128" -Recurse -Force | Where-Object {!$_.PSIsContainer -and $_.LastAccessTime -lt [datetime]::ParseExact("10/08/2019","dd/MM/yyyy", $null)}

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 17
    Points
    17
    Par défaut
    Merci je vais l’intégrer a ce que j'ai déjà.

    J'abandonne mes feuilles excel....

  6. #6
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 17
    Points
    17
    Par défaut
    Me revoilà, tout d'abord merci de votre aide, j'arrive enfin à avoir un peu de résultats..

    Là je suis sur un script qui fonctionne bien, il me donne une arborescence de répertoires et sous répertoire que je bloque au niveau désiré, par contre je n'arrive pas à exporter le résultat soit en .xls ou en .txt

    Je vous mets le petit script (qui n'est pas de moi)

    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
    clear
    $dossier ="\repertoires_serveurs_pour_test_script"
    $Niveau = 6
    $resultat=@()
    $SubFolders = (Get-ChildItem -path $dossier -recurse -Directory -Depth $($niveau-1)).FullName
    foreach ($subfolder in $SubFolders)
        {
         $FolderSize = Get-ChildItem -path $SubFolder -Recurse -File | Measure-Object -Sum Length       
         $FolderNumberOfFile =      (Get-ChildItem -path $SubFolder -Recurse -File).count
     
         $resultat+= New-Object -TypeName PSObject -Property @{
                            Path                  = $subfolder
                            Files                 =$FolderNumberOfFile
                            Size_Mb               = $foldersize.sum/1mb
     
     
        }
        }
     
     
    $resultat | Sort-Object -Property path

    une idée??
    merci

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Voici avec quelques retouches sur des chose qui m’agaçais.

    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
    Clear-Host
     
    $dossier = "\repertoires_serveurs_pour_test_script"
    $Niveau = 6
     
    $resultat = @()
    $SubFolders = (Get-ChildItem -path $dossier -Recurse -Directory -Force -Depth $($niveau - 1)).FullName
    foreach($subfolder in $SubFolders)
    {
        $folderFiles = Get-ChildItem -path $SubFolder -Recurse -File -Force
     
        $resultat += New-Object -TypeName PSObject -Property @{
            Path = $subfolder
            Nbr_Files = $folderFiles.count
            Size_Mb =  ($folderFiles | Measure-Object -Sum Length).Sum / 1mb
        }
    }
     
    $resultat | Sort-Object -Property Path | Export-Csv -Path "export.csv" -NoTypeInformation -Delimiter ";" -Encoding Default -Force

    Edit : Ajouter -Force à Get-ChildItem pour les fichiers cachés
    Je laisse volontairement les "erreurs" à l'affichage.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 17
    Points
    17
    Par défaut
    un grand merci!!!!!
    je test ça demain au boulot.
    je vous tiens au courant.
    Bonne soirée.

  9. #9
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Avec des pipelines de Select-Object c'est pas mal aussi.
    On aurait même pu mettre le Sort-Object + Export-Csv à la suite.

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Clear-Host
     
    $dossier = "\repertoires_serveurs_pour_test_script"
    $niveau = 6
     
    $resultat = Get-ChildItem -path $dossier -Recurse -Directory -Depth $($niveau - 1) -Force | 
    Select-Object @{label = "Path" ; expression={$_.FullName}}, @{label = "folderFiles" ; expression={Get-ChildItem -path $_.FullName -Recurse -File -Force}} | 
    Select-Object Path, @{label = "Nbr_Files" ; expression={$_.folderFiles.count}}, @{label = "Size_Mb" ; expression={($_.folderFiles | Measure-Object -Sum Length).Sum / 1mb}}
     
    $resultat | Sort-Object -Property Path | Export-Csv -Path "export.csv" -NoTypeInformation -Delimiter ";" -Encoding Default -Force

  10. #10
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 17
    Points
    17
    Par défaut
    On aurait même pu mettre le Sort-Object + Export-Csv à la suite... la je t'avoue que je ne voit pas ce que ça ferait c'est encore un peu du chinois pour moi....

    Demain je vais continuer l'autre script pour trier les fichier a partir d'une date d'accès, il fonctionne mais je n'arrive pas a lui faire déplacer les fichiers de la source vers la cible.

    En tout cas merci pour ton aide sur ce coup là, je me coucherai moins bête!!
    bonne soirée

  11. #11
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    J'ai fait mon deuxième script, celui du tri de fichier par date, je reviens vers vous car je voudrait exporter ce qu'il m'affiche en console vers un csv( pour avoir un listing), puis reprendre ce csv pour déplacer les fichier vers un autre serveur en recréant l'arborescence des dossiers d'origine .
    je cale encore, donc j'ai besoin de votre aide

    merci

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #script de filtrage de fichiers par date de dernier accès
    Clear-Host
     
    #chemin d'entrée a traiter
    $quit = "nouvel export"
    do {
    Clear-Host
    $retry = "retentez"
    do {
    $ReponseUtilisateur = read-host "Entrez le nom du dossier à traiter EX :\\servertest\repertoire A   (réponse par défaut si vide)  $($MyFile.name)"
    if ($ReponseUtilisateur.Length -eq 0) {$ReponseUtilisateur = $ValeurParDefaut} #Si l'utilisateur n'a pas répondu, on met une valeur par défaut 
    Write-Host ""
    Write-Host ""
    $retry = Read-Host “Le repertoire choisi est: $ReponseUtilisateur" "est-ce correct ? (Y/N)}
    until ($retry -eq “y”)
    #chemin de sortie 	
    $retry = "retentez"
    do {
    $ReponseUtilisateur2 = read-host "chemin du repertoire de sortie.csv EX : C:\Users\Documents\*  (réponse par défaut si vide) $($MyFile.name)"
    if ($ReponseUtilisateur2.Length -eq 0) {$ReponseUtilisateur2 = $ValeurParDefaut} #Si l'utilisateur n'a pas répondu, on met une valeur par défaut 
     
    Write-Host ""
    Write-Host ""
    $retry = Read-Host “Le repertoire choisi est : $ReponseUtilisateur2" "est-ce correct ? (Y/N)}
    until ($retry -eq “y”)
     
    #definition des variables
    $dossier = $ReponseUtilisateur
    $cheminsortie = $ReponseUtilisateur2
     
     
    #choix de la date maximale de tri (tout ce qui est avant cette date est traité"
    $retry2 = "retentez"
    do {
    $dateselectionnée = read-host "Entrez la date a traiter format jj/mm/aa  (réponse par défaut si vide)  $($MyFile.name)"
    if ($dateselectionnée.Length -eq 0) {$dateselectionnée = $ValeurParDefaut} #Si l'utilisateur n'a pas répondu, on met une valeur par défaut 
    Write-Host ""
    Write-Host ""
    $retry2 = Read-Host “La date choisie est: $dateselectionnée" "est-ce correct ? (Y/N)}
    until ($retry2 -eq “y”)
     
    #traitement de sortie
     
    Get-ChildItem -Path "C:\ericlm128" -Recurse -Force | Where-Object {!$_.PSIsContainer -and $_.LastAccessTime -lt [datetime]::ParseExact("$dateselectionnée","dd/MM/yyyy", $null)}
     
     
    #$resultat | Sort-Object -Property Path | Export-Csv -Path "$cheminsortie\$fichier.csv" -NoTypeInformation -Delimiter ";" -Encoding Default 
    #efface console 
    #clear-host
    #affiche le fichier créé dans le repertoire
    Write-Output "Le fichier $fichier.csv à été créé dans le repertoire $cheminsortie "
    $quit = Read-Host “Voulez-vous arrêter? (Y/N)}
    until ($quit -eq “Y”)
     
    pause

  12. #12
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Je serais toi je me créerai une fonction (choice par exemple) et je mettrai de l'indentation parce que la c'est illisible.
    Tu utilise aussi des variables qui n'ont jamais été initialisées.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    function choice([string]$prompt, [string[]]$AcceptValue = "", [string]$defaultValue = "")
    {
        # Dans le prompt nous pouvons utiliser la valeur spécial #promptinfo# qui sera remplacé par les valeurs acceptées et par default
        $promptinfo = ""
     
        if ($AcceptValue -ne "")
        {
            $promptinfo = "(valeurs acceptées : " + $($AcceptValue -join "/") + ")"
        }
     
        if ($defaultValue -ne "")
        {
            $promptinfo += " (valeur par default : " + $defaultValue + ")"
        }
     
        if ($promptinfo -ne "")
        {
            $promptinfo = " " + $promptinfo.Trim() + " "
        }
     
        $prompt = ($prompt -replace "#promptinfo#", $promptinfo -replace "  ", " ").Trim()
     
        while ($true)
        {
            $result = Read-Host -Prompt $prompt
     
            if ($result -eq "" -and $defaultValue -ne $null)
            {
                $result = $defaultValue
            }
     
            if ($AcceptValue -ne "" -and ($result -notin $AcceptValue))
            {
                Write-Host "Valeur inacceptable ! veuillé rééssayer !" -ForegroundColor Red
                continue
            }
            else
            {
                return $result
            }
        }
    }
     
    do
    {
        do
        {
            $ReponseUtilisateur = choice "Entrez le nom du dossier à traiter EX : \\servertest\repertoire A#promptinfo#" "" "C:\dossieratraiter"
        } until ((choice "Le dossier choisi est $ReponseUtilisateur, est-ce correct #promptinfo# ?" ("Y", "N")) -eq "Y")
     
        Write-Host ""
        do
        {
            $ReponseUtilisateur2 = choice "Entrez le nom du dossier de sortie.csv EX : C:\Users\Documents#promptinfo#" "" "C:\dossiersortie"
        } until ((choice "Le dossier choisi est $ReponseUtilisateur2, est-ce correct #promptinfo# ?" ("Y", "N")) -eq "Y")
     
        Write-Host ""
        do
        {
            $dateselectionnée = choice "Entrez la date a traiter au format jj/mm/aa A#promptinfo#" "" (Get-Date).ToString("dd/MM/yyyy")
        } until ((choice "La date choisie est: $dateselectionnée, est-ce correct #promptinfo# ?" ("Y", "N")) -eq "Y")
     
     
        Get-ChildItem -Path $ReponseUtilisateur -Recurse -Force | Where-Object {!$_.PSIsContainer -and $_.LastAccessTime -lt [datetime]::ParseExact($dateselectionnée, "dd/MM/yyyy", $null)} | Sort-Object -Property Path | Export-Csv -Path "$ReponseUtilisateur2\sortie.csv" -NoTypeInformation -Delimiter ";" -Encoding Default
     
        Write-Output "Le fichier sortie.csv à été créé dans le repertoire $ReponseUtilisateur2"
     
        Write-Host ""
    } until ((choice "Voulez-vous arrêter #promptinfo# ?" ("Y", "N")) -eq "Y")

  13. #13
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Octobre 2019
    Messages : 60
    Points : 17
    Points
    17
    Par défaut
    Bonsoir

    Merci pour la correction, cela me montre ô combien je doit progresser....
    J'ai relu le script que j'ai posté et en effet il y a plein d'erreurs, la fatigue et l’incompétence, et je n'en pouvais plus hier soir.

    Demain je doit trouver comment faire pour que le script écrive un raccourci qui pointe vers la cible d'archivage dans chaque dossier ou il aura déplacé des fichiers........ c'est pas gagné, mais bon Paris ne c'est pas fait en un jour....
    En tout cas je te remercie pour ton aide précieuse.

    bonne soirée

Discussions similaires

  1. Copie de fichier avec Runtime
    Par seb591 dans le forum Langage
    Réponses: 8
    Dernier message: 24/07/2007, 16h07
  2. Copie de fichier avec un autre utilisateur
    Par cretindezalpes dans le forum Delphi
    Réponses: 7
    Dernier message: 02/04/2007, 17h01
  3. [cURL] Copie de fichier avec Curl
    Par eowene dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 17/11/2006, 15h03
  4. Copie de fichiers avec progressbar
    Par serialmatrix dans le forum C++
    Réponses: 3
    Dernier message: 11/02/2006, 18h30
  5. Réponses: 3
    Dernier message: 19/10/2005, 15h58

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