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 :

Script PowerShell pour déplacer des répertoires vers une nouvelle arborescence [PowerShell]


Sujet :

Scripts/Batch

  1. #21
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 222
    Par défaut
    Un exemple :

    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
    $items = Import-Csv -Path ".\monfichier.csv" -Delimiter ";" -Encoding Default
     
    $indexMax = $items.count
    for($ii = 0; $ii -lt $items.count; $ii++ )
    {
     
        $item = $items[$ii]
        $index = $ii
     
        $percent = $index * 100 / $indexMax
     
     
        Write-Progress -Activity "Copie" -Status "$($percent.ToString("0.##")) % : $($item.source)" -PercentComplete $percent
     
        if (Test-Path -Path $item.source -PathType Container)
        {
            if (!(Test-Path -Path $item.destination -PathType Container))
            {
                New-Item -Path ($item.destination) -ItemType "directory" | Out-Null
            }
     
            $Error.Clear()
            Copy-Item -Path ($item.source + "\*") -Destination $item.destination -Recurse -ErrorAction SilentlyContinue
            if ($Error.Count -ne 0)
            {
                $Error.Exception.Message | Out-File -FilePath ".\error.log" -Append -Encoding default
            }
        }
    }
     
    Write-Progress -Activity "Copie" -Completed

  2. #22
    Membre averti
    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
    Par défaut
    Bonjour,
    Merci pour ta réponse, désolé de ne répondre que maintenant j'ai mon pc perso qui m'a lâché vendredi.
    Je vais essayer d’intégrer ton code, je reviens vers toi si problème.

    Bonne journée.

  3. #23
    Membre averti
    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
    Par défaut
    Bonjour,

    Voici le script, il est loin d'être aux "normes du scripting", mais il fait le boulot... enfin j'espère, je vais le tester en réel "copie d'ancien vers nouveau serveur" tout à l'heure :

    Script :
    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
    70
     
        chcp 1252
           Clear-Host
     
    #Script de copie de répertoire et de fichiers vers une nouvelle arborescence définie dans un fichier csv
     
        Write-Host script de copie de répertoire et de fichiers vers une nouvelle arborescence définie dans un fichier csv
     
    #Définition des variables:
        $ImportData = "C:\Users\*****\Desktop\template.csv" 
        $cheminsortie = "C:\Users\*****\Documents\WindowsPowerShell\test"
        $finallog = "C:\Users\*****\Documents\WindowsPowerShell\logs"
        $logerror = "C:\Users\*****\Documents\WindowsPowerShell\log error"
        $fileName = Get-Date -format dd.MM.yyyy-hh.mm.ss
     
    #Tronquage chemin source pour nommage du fichier de sortie
        $nomdefichier = "$ImportData"
        $T=$nomdefichier.Split("\") 
            Write-Host "Nom de fichier"
            Write-Host ""
        $t[-1] # prend  l'avant dernier élément
    #Nom du fichier qui sera écrit
            Write-Host ""
        $fichier=$t[-1]
     
    #Comptage des lignes du fichier CSV
        $measure = Get-Content $ImportData 
        $lines = ($measure | Where-Object {$_ -ne ""}).Count 
            Write-Host "Nombre de lignes dans $fichier est de : ${lines}"
     
    #Affichage du contenu SOURCE et DESTINATION du fichier CSV
           (Get-Culture).TextInfo.ListSeparator 
            Import-Csv -Path $ImportData -UseCulture -Encoding UTF7 | Select-Object SOURCE | Sort-Object -Property Path | Export-Csv -Path "$cheminsortie\$fileName source $fichier " -NoTypeInformation -Delimiter ";" -Encoding Default -force
            Import-Csv -Path $ImportData -UseCulture -Encoding UTF7 | Select-Object DESTINATION | Sort-Object -Property Path | Export-Csv -Path "$cheminsortie\$fileName cible $fichier " -NoTypeInformation -Delimiter ";" -Encoding Default -force
     
     
     
    #Copie des fichiers :
           import-Csv -Path "$ImportData" -Delimiter ";" -Encoding Default | ForEach-Object {
     
             if (Test-Path -Path $_.source -PathType Container)  
                {
              if (!(Test-Path -Path $_.destination -PathType Container))
                 {       
                    New-Item -Path ($_.destination) -ItemType "directory" | Out-Null 
                     }         
                }
     
    #Barres de progression de copie
     
    1..10 | foreach-object {
                 Write-Progress -Activity "Copying files" -Status "$($_*10) %" -Id 1 -PercentComplete ($_*10) -CurrentOperation "Copying file"  
    1..100 | foreach-object {
                 Write-Progress -Activity "Copying contents of the file $ImportData" -Status "$_ %" -Id 2 -ParentId 1 -PercentComplete $_ -CurrentOperation "Copying "
    						}
    						}	
                   if ($Error.Count -ne 0)
            {
                    write-host $error[0].exception.message -ForegroundColor red
                        $Error.Exception.Message | Out-File -FilePath "$logerror\$fileName logerror.txt" -Append -Encoding default -Force
                        $Error.Clear()
    #Fin barres de progression
     
    		}
    #Copie" 
     
            Copy-Item -Path ($_.source + "\*") -Destination $_.destination -Recurse -PassThru >>"$finallog\$fileName logfinal $fichier"
     }
     
     #fin de script

    Merci de ton aide

  4. #24
    Membre averti
    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
    Par défaut
    Bonsoir ,

    Me revoilà..
    J'ai enfin pu tester le script, je l'ai modifié depuis la dernière fois, plus de barre de progression mais un affichage sur la console des fichiers copiés, et un compteur temps aussi.
    tous les test fait à partir de dossiers présents sur mon pc vers un répertoire du serveur se sont bien déroulés. Donc ce matin je lance le test du répertoire à copier qui est sur le serveur "A" vers le répertoire de destination qui contiendra la nouvelle arborescence qui est aussi sur le serveur "A".

    -Le début de la copie se passe bien, puis au bout de 10 minutes j'ai des erreurs de copie : impossible de lire une partie de chemin de :"A:\test\ parabole\......" pourtant j’accède parfaitement au répertoire et aux fichiers présent dedans.
    J'ai changé l'instruction de "copy-item path $_.source " par "[=PowerShell]copy_item literalpath $_.source[/C]" et pas de changements. j'ai aussi mis -force et pas de changement.
    l'erreur de copie n'est pas toujours sur les même dossier, donc je me posais la question si il était possible de mettre un légère temporisation a la boucle de copie, et si oui quel en est le code?

    Script :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import-Csv -Path "$ImportData" -Delimiter ";" -Encoding Default | ForEach-Object {
     
    if (Test-Path -Path $_.source -PathType Container)
    {
    if (!(Test-Path -Path $_.destination -PathType Container))
    {
    New-Item -Path ($_.destination) -ItemType "directory" | Out-Null
    }
    #Copie"
     
    Copy-Item -LiteralPath ($_.source + "\*") -Destination $_.destination -Recurse -PassThru -force
    }
    Merci de vos réponses.
    euh comment fait-on pour mettre de la couleur aux lignes de script ?
    Mic

  5. #25
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 222
    Par défaut
    Quelles "commandes" ?

  6. #26
    Membre averti
    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
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Quelles "commandes" ?
    Bonjour Ericlm128

    je ne comprend pas pourquoi il y a des fichiers qui ne se copie pas , le log error me retourne "Impossible de trouver une partie du chemin d'accès : ......"
    pourtant je peux y accéder en graphique et j'ai tous les droits sur le serveur. je me demandais si ça n’était pas dû a la vitesse d’exécution du script, d'ou l'idée de mettre une légère temporisation dans la boucle.
    L’autre piste est la longueur des noms de fichiers..

    Pour ma dernière question : "comment fait-on pour mettre de la couleur aux lignes de script "

    comment fait-on pour mettre de la couleur aux lignes de script quand je copie les lignes du script sur le forum

  7. #27
    Membre averti
    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
    Par défaut
    bon j'ai trouvé pour l'erreur de copie..

    je n'ai pas les droits sur certains fichiers, tous les fichiers avec erreur de copie je n'ai pas l’onglet "sécurité". pourtant je peux les copier en mode graphique, mais pas avec powershell.

  8. #28
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 222
    Par défaut
    comment fait-on pour mettre de la couleur aux lignes de script
    Comme ceci, mais en mettant powershell au lieu de SQL
    Nom : Balises.gif
Affichages : 1302
Taille : 19,9 Ko

  9. #29
    Membre averti
    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
    Par défaut
    Bonjour ,

    Je te remercie pour ta réponse.
    Suite aux erreurs de copie lors du test d'hier, j'ai modifié le script en remplaçant "copy-item" par "robocopy". les test de ce matin sur certains fichiers qui posaient problème sont encourageant. En fait l’adresse de certains fichiers sur le serveur etait comme ceci : "\\?\z:\foldertoto\tata.xls" au lieu de : "z:\foldertoto\tata.xls" donc problème d'accès pour copier le fichier. Robocopy semble corriger le problème lors de la copie.... à confirmer avec les tests de cet après-midi.
    Mais avant de lancer le script sur le serveur peut-tu me dire si il est correct.( désolé pour tes yeux de pro )

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
    chcp 1252
    Clear-Host
    #Script de copie de répertoire et de fichiers vers une nouvelle arborescence définie dans un fichier csv
    #Ce script copie des repertoires et fichiers listé dans une feuille CSV depuis un disque ou dossier source vers un disque ou dossier cible selon le chemin entré dans
    #la colonne "destination" de la feuille CSV. 
        Write-Host script de copie de répertoire et de fichiers vers une nouvelle arborescence définie dans un fichier csv
    #Auteur **** *******
     
    Write-Host ""
    Write-Host ""
        Write-Host "Attention le fichier CSV à traiter doit être dans ce repertoire" : $csv -ForegroundColor Red
     
    #Feuille CSV a traiter
    $csv = Set-Location "C:\Users\Documents\scripts\Script_de_copie_depuis_CSV\feuilles_CSV" 
    $feuille= Get-ChildItem $csv -Recurse -Name
    ls $csv
    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”)
    Write-Host ""
    Write-Host ""
     
    #Définition des variables:
        $ImportData   = $ReponseUtilisateur
        $log          = "C:\Users\Documents\scripts\Script_de_copie_depuis_CSV\logs"
        $cheminsortie = "$log\$importdata\logs_source_et_destination"
        $finallog     = "$log\$importdata\log_compte_rendu"
        $robo         = "$log\$importdata\Log_Robocopy"
        $fileName     = Get-Date -format dd.MM.yyyy
     
    #Tronquage chemin source pour nommage du fichier de sortie
        $nomdefichier = "$ImportData"
        $T=$nomdefichier.Split("\") 
            Write-Host "Nom de fichier"
            Write-Host ""
        $t[-1] # prend  l'avant dernier élément
     
    #Nom du fichier qui sera écrit
            Write-Host ""
        $fichier=$t[-1]
     
    #Comptage des lignes du fichier CSV
        $measure = Get-Content $ImportData 
        $lines = ($measure | Where-Object {$_ -ne ""}).Count 
     
     
    #Création des dossiers log
     
    New-Item -ItemType Directory -Force -Path $cheminsortie
    New-Item -ItemType Directory -Force -Path $finallog
    New-Item -ItemType Directory -Force -Path $logerror
    New-Item -ItemType Directory -Force -Path $robo
     
    #Création de eux logs séparé du contenu SOURCE et DESTINATION du fichier CSV
           (Get-Culture).TextInfo.ListSeparator 
     
            Import-Csv -Path $ImportData -UseCulture -Encoding Default | Select-Object SOURCE | Sort-Object -Property Path | Export-Csv -Path "$cheminsortie\$fileName source $fichier " -NoTypeInformation -Delimiter ";" -Encoding Default -force
            Import-Csv -Path $ImportData -UseCulture -Encoding Default | Select-Object DESTINATION | Sort-Object -Property Path | Export-Csv -Path "$cheminsortie\$fileName cible $fichier " -NoTypeInformation -Delimiter ";" -Encoding Default -force
            import-Csv -Path "$ImportData" -Delimiter ";" -Encoding Default | ForEach-Object {
     
             if (Test-Path -Path $_.source -PathType Container)  
                {
              if (!(Test-Path -Path $_.destination -PathType Container))
                 {       
                    New-Item -Path ($_.destination) -ItemType "directory" -Force| Out-Null 
            }            
     
    #recuperation des CSV  cible et destination
     
    $csvFile   = "$importdata"
    $sourcecsv = "$cheminsortie\$fileName source $fichier"
    $destcsv   = "$cheminsortie\$fileName cible $fichier"
    $Logfile   = "$robo\robocopy_" + "_" + $(get-date -f dd-MM-yyyy_HH_mm_ss) + ".log"
     
    #copie des fichiers et dossiers avec generation des rapports 
     
            Import-Csv $csvFile -Delimiter ';' | 
                 ForEach-Object {
    	        	$srcDoc = $quote + $_.Source + $quote
    		        $dstDoc = $quote + $_.Destination + $quote
     
            Write-Host "Source dir:" $srcDoc -ForegroundColor green
    		Write-Host "Dest.  dir:" $dstDoc -ForegroundColor green
    		Write-Host "--------------------------------------------------------------------------------------------------------------------------------------"
     
            RoboCopy "$srcDoc" "$dstDoc"  /E /tee /V /np /R:10 /W:30 /log+:$Logfile
     
                         $Error.Exception.Message | Out-File -FilePath "$logerror\$fileName logerror.txt" -Append -Encoding default -Force
                        $Error.Clear()
        }
        # Fichier log de la copie
           Get-ChildItem $_.destination >> "$finallog\$fileName logfinal $fichier" -Recurse -Force 
        #copie des fichiers log vers le repertoire partagé:
           robocopy "$log" "H:\test\toto\01-nouveaux Serveurs\log copie nouvelle arborescence"  /E /tee /V /np
     
            }
            }
     
    Clear-Host
     Write-Host Nombre de lignes dans $fichier est de : $lines 
    Write-Host ""
    Write-Host  "copie terminée"   -ForegroundColor Green 
    Write-Host ""
    Write-Host ""
    Write-Host "les fichiers log sont à cet emplacement : "
    Write-Host ""  
    write-host "log erreur                : $ImportData\$logerror" 
    write-host "log copie                 : $ImportData\$finallog" 
    write-host "log source et destination : $ImportData\$cheminsortie" 
    write-host "log Robocopy              : $importdata\$robo"
    Write-Host ""
    Write-Host ""
    Write-Host "opération complètée"
    pause

    Merci .

  10. #30
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 222
    Par défaut
    \\?\c: est un chemin valide appelé chemin de périphérique DOS : https://docs.microsoft.com/fr-fr/dot...e-path-formats

    J'ai survolé le script, et en l'état ton script ne doit pas fonctionner. Tu veux pas le tester avant ?
    chcp 1252 : Pour quoi faire ?
    $ValeurParDefaut : Cette variable n'est pas définit
    $retry = Read-Host ?Le repertoire choisi est: $ReponseUtilisateur" "est-ce correct ? (Y/N)? : Problème de guillement
    $t[-1] # prend l'avant dernier élément : Je dirais plutôt le dernier élement
    -UseCulture : Je te dé-conseil d'utiliser ce paramètre, si tu connait le caractère délimiteur tu le spécifie en dur. Les personnes qui bidouille leur paramètre Windows peuvent avoir une incidence sur ton script.
    $quote : Cette variable n'est pas définit
    $Error.Exception.Message : Maintenant tu copie avec RoboCopy (programme externe) je ne pense pas que tu aura des erreurs très parlantes.

  11. #31
    Membre averti
    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
    Par défaut
    Je te remercie.
    J ai testé le script il fonctionne. Tu as raisons j ai pas de rapport d erreur, j ai aussi oublié de definir la variable $quote je l ai rectifié tout a l heure.
    Je te remercie pour ton analyse je modifierai tout ça demain matin.
    Pour le chemin DOS comment a t il pu se mettre sur quelques fichiers d un serveur SFS?
    Bonne soirée

  12. #32
    Membre averti
    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
    Par défaut
    bonjour,

    J'ai modifié le script en suivant tes conseils, le test de ce matin ce passe à merveille.... sauf que évidement un nouveau cas de figure viens de se poser :

    On recopie dans la nouvelle arborescence des dossiers qui viennent d'endroit différents. Le problème c'est que certains de ces dossiers portent le même nom mais n'ont pas le même contenu.

    D’où ma question comment faire avec robocopy ( ou autre solution) pour renommer le dossier style "toto " en "toto_1" "toto_2" ?

    Merci

  13. #33
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 222
    Par défaut
    Dans ce cas la tu ne respecte plus le csv.

    Il n'y a qu'a faire une vérification $dstDoc avant la copie et le modifier au besoin.

  14. #34
    Membre averti
    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
    Par défaut
    Merci de ta réponse.
    J ai inséré un test avec une boucle if mais je trouve pas comment renommerle dosdier en reprenant les variables, style "toto_1"le dossier avant de copier.
    Bonne soirée

  15. #35
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 222
    Par défaut
    Un exemple avec la variable $dossier et une vérification de répertoire existant

    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
    $dossier = "C:\_test"
     
    if (Test-Path -Path $dossier -PathType Container)
    {
        $dossier += "_"
        for ($i = 1; $i -le [int]::MaxValue; $i++)
        {
            if (!(Test-Path -Path $($dossier + $i) -PathType Container))
            {
                $dossier += $i.ToString()
                break;
            }
        }	
    }
     
    $dossier

  16. #36
    Membre averti
    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
    Par défaut
    bonjour,
    Merci pour ton exemple, je vois où je me plantais .

    Bonne journée

  17. #37
    Membre averti
    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
    Par défaut
    Bon bin rien n'y fais je n'arrive pas a faire fonctionner cette boucle de test.

    Pour le moment j'ai enlevé -force lors de la création des dossiers et de la copie, et j'essaye de voir comment récupérer l'erreur générée pour copier de nouveau le dossier là ou il doit être en changeant le nom, mais je ne trouve pas beaucoup d'infos pour mon cas de figure sur Google.

  18. #38
    Membre averti
    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
    Par défaut
    Bonjour Ericlm128,

    Petit retour,
    Déjà la bonne nouvelle, ça fonctionne, je copie pour le moment les répertoires et les répertoires de même nom sont bien renommés **_1 .... à voir si cela convient à l'équipe! Merci pour ton aide.

    Je ne sais pas pourquoi ça ne fonctionnait pas la semaine dernière, car j'ai perdu mon script ce matin suite à une erreur de manip bête! donc je l'ai refait et là ça fonctionne !
    j'attend la fin du test en cours, (il y en a pour 4h) je corrige quelques instructions et si tu veux je le met sur le post.
    Merci encore de ton aide.

  19. #39
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 222
    Par défaut
    Ah c'est bien tu as finalement réussi

    Oui tu peux poster ton projet final, si ça peux servir à quelqu'un d'autre.

  20. #40
    Membre averti
    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
    Par défaut
    Bonjour,

    alors voici en premier lieu le script de déplacement de dossier et fichier d'une arborescence vers un nouvelle arborecence. ce script s'appuye sur une feuille CSV avec une colonne source et une colonne destination.
    Il reste une variable à définir : "$ValeurParDefaut".
    Je l'ai testé et il fonctionne sur les serveurs distant de mon boulot.

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
     
    Clear-Host
    #Script de copie de répertoire et de fichiers vers une nouvelle arborescence définie dans un fichier csv
    #Ce script copie des repertoires et fichiers listé dans une feuille CSV depuis un disque ou dossier source vers un disque ou dossier cible selon le chemin entré dans
    #la colonne "destination" de la feuille CSV. Ensuite ce script créer des fichiers rapport "log", compte le temps d'execution et le volume copié.
        Write-Host script de copie de répertoires et de fichiers vers une nouvelle arborescence définie dans un fichier csv
    #Auteur Michel
     
    Write-Host ""
    Write-Host ""
    #Début comptage temps éxecution
        $Avant = Get-Date
     
        Write-Host "Attention le fichier CSV à traiter doit être dans ce repertoire" : $csv
     
    #Feuille CSV a traiter
    $csv = Set-Location "C:\Users\Documents\scripts\Script_de_copie_depuis_CSV\feuilles_CSV"
    $feuille= Get-ChildItem $csv -Recurse -Name
    ls $csv
    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”)
    Write-Host ""
    Write-Host ""
     
    #Définition des variables:
        $ImportData = $ReponseUtilisateur
        $log = "C:\Users\Documents\scripts\Script_de_copie_depuis_CSV\logs"
        $cheminsortie = "$log\$importdata\logs_source_et_destination"
        $finallog = "$log\$importdata\log_compte_rendu"
        $logerror = "$log\$importdata\log_error"
        $tempsexec = "$log\$importdata\log_temps_exec"
        $volume = "$log\$importdata\log_volume"
        $fileName = Get-Date -format dd.MM.yyyy-hh.mm.ss
     
    #Tronquage chemin source pour nommage du fichier de sortie
        $nomdefichier = "$ImportData"
        $T=$nomdefichier.Split("\")
            Write-Host "Nom de fichier"
            Write-Host ""
        $t[-1] # prend  l'avant dernier élément
    #Nom du fichier qui sera écrit
            Write-Host ""
        $fichier=$t[-1]
     
    #Comptage des lignes du fichier CSV
        $measure = Get-Content $ImportData
        $lines = ($measure | Where-Object {$_ -ne ""}).Count
     
     
    #Création des dossiers log
     
    New-Item -ItemType Directory -Force -Path $cheminsortie
    New-Item -ItemType Directory -Force -Path $finallog
    New-Item -ItemType Directory -Force -Path $logerror
    New-Item -ItemType Directory -Force -Path $tempsexec
    New-Item -ItemType Directory -Force -Path $volume
     
    #Affichage du contenu SOURCE et DESTINATION du fichier CSV
     
            Import-Csv -Path "$ImportData" -Delimiter ";" -Encoding Default | Select-Object SOURCE | Sort-Object -Property Path | Export-Csv -Path "$cheminsortie\$fileName source $fichier " -NoTypeInformation -Delimiter ";" -Encoding Default -force
            Import-Csv -Path "$ImportData" -Delimiter ";" -Encoding Default | Select-Object DESTINATION | Sort-Object -Property Path | Export-Csv -Path "$cheminsortie\$fileName cible $fichier " -NoTypeInformation -Delimiter ";" -Encoding Default -force
            import-Csv -Path "$ImportData" -Delimiter ";" -Encoding Default | ForEach-Object {
     
             if (Test-Path -Path $_.source -PathType Container)  
                {
              if (!(Test-Path -Path $_.destination -PathType Container))
                 {      
                    New-Item -Path ($_.destination) -ItemType "directory" | Out-Null
            }            
    #copie des fichiers et dossiers avec generation des rapports
     
                    Write-Host "Source dir:" $_.source -ForegroundColor green
                    Write-Host "Dest.  dir:" $_.destination -ForegroundColor green
                    Write-Host "--------------------------------------------------------------------------------------------------------------------------------------"  
     
                    Copy-Item -Path ($_.source + "\*" ) -Destination $_.destination -Recurse -PassThru
     
                       Get-ChildItem $_.destination >> "$finallog\$fileName logfinal $fichier" -Recurse -Force
     
                        $Error.Exception.Message | Out-File -FilePath "$logerror\$fileName logerror.txt" -Append -Encoding default -Force
                        $Error.Clear()
    #Calcul de la somme des volumes copiés
     
     
             # en KB          
            $foldersizeKB = Get-ChildItem $_.destination -recurse | Measure-Object -property length -sum
            $foldersizeKB = $foldersizeKB.sum / 1KB
              # en MB
            $foldersizeMB = Get-ChildItem $_.destination -recurse | Measure-Object -property length -sum
            $foldersizeMB = $foldersizeMB.sum / 1MB
              # en GB
            $foldersizeGB = Get-ChildItem $_.destination -recurse | Measure-Object -property length -sum
            $foldersizeGB = $foldersizeGB.sum / 1gB
     
            #copie dans le fichier log
            $foldersize = $foldersizeKB, $foldersizeMB, $foldersizeGB
            Set-Content "$volume\volume-copie-de_$importdata $fileName.txt" $foldersize
     
            #fin comptage temps et affichage console et log
            $Apres = Get-Date
             $TempsEcoule =((Get-Date $Apres)(Get-Date $Avant)).tostring() >>"$tempsexec\$fileName temps.txt"
                $TempsEcoule= ((Get-Date $Apres)(Get-Date $Avant)).tostring()
     
    #copie des fichiers log vers le repertoire partagé:
    robocopy "$log" "H:\Organisation Serveurs\log copie nouvelle arborescence" /s
     
            }
            }
     
    Clear-Host
    Write-Host Nombre de lignes dans $fichier est de : $lines -ForegroundColor Green
    Write-Host ""
    Write-Host  "copie terminée"   -ForegroundColor Green
    Write-Host ""
    Write-Host temps éxecution script :  $TempsEcoule
    Write-Host ""
    Write-Host Volume Copié KB : $foldersizeKB "KB"
    Write-Host Volume Copié MB : $foldersizeGB "GB"
    Write-Host Volume Copié GB: $foldersizeGB "GB"
    Write-Host ""
    Write-Host "les fichiers log sont à cet emplacement : "  -ForegroundColor Green
    write-host "log erreur : $ImportData\$logerror"
    write-host "log copie : $ImportData\$finallog"
    write-host "log source et destination : $ImportData\$cheminsortie"
    write-host "log tempexec: $ImportData\$tempsexec"
    write-host "log volume copie:$ImportData\$volume"
    Write-Host ""
    Write-Host ""
     
    pause

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Application pour transfert des SMS vers une boite Email
    Par itasoft dans le forum Mon application mobile
    Réponses: 0
    Dernier message: 11/05/2018, 06h52
  2. Réponses: 12
    Dernier message: 13/04/2018, 11h15
  3. Macro pour envoyer des graphiques vers une feuille existante
    Par benjy777 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/04/2017, 23h19
  4. [SP-2010] Script Powershell pour récupérer des données
    Par jip31 dans le forum SharePoint
    Réponses: 1
    Dernier message: 28/04/2015, 14h21
  5. Importation des données vers une nouvelle BD
    Par Msysteme dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/12/2009, 14h15

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