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 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
#code page d'affichage console
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. 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épertoire et de fichiers vers une nouvelle arborescence définie dans un fichier csv
#Auteur M****l ****
Write-Host ""
Write-Host ""
#Début comptage temps éxecution
$Avant = Get-Date
Write-Host "Attention le fichier CSV à traiter doit être dans ce répertoire" : $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 $($MyFile.name)"
if ($ReponseUtilisateur.Length -eq 0) {$ReponseUtilisateur = exit} #Si entrée vide, on sort de Powershell
Write-Host ""
Write-Host ""
$retry = Read-Host Le répertoire 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 le 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
#Import du contenu SOURCE et DESTINATION du fichier CSV
#creation log CSV SOURCE (pour traitement posterieur éventuel)
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
#creation log CSV DESTINATION (pour traitement posterieur éventuel)
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 du fichier CSV Pour traitement
import-Csv -Path "$ImportData" -Delimiter ";" -Encoding Default | ForEach-Object {
#Boucle de test et de renommage si dossier du même nom déjà présent et copie
$src = $_.source
$dst = $_.destination
# Récupère un objet "System.IO.DirectoryInfo" du dossier source
$OSrc = Get-Item -Path "$src"
# Si le "Chemin de destination" + "le nom du dossier source" existe
if (Test-Path -Path (Join-Path -Path $dst -ChildPath $OSrc.Name) -PathType Container)
{
# On ajoute le nom du dossier parent
$dst = Join-Path -Path $dst -ChildPath $($OSrc.Parent.Name + "-" + $OSrc.Name)
}
else
{
# Sinon on le garde
$dst = Join-Path -Path $dst -ChildPath $OSrc.Name
}
#copie des fichiers et dossiers avec generation des rapports
Write-Host "Source dir:" $src -ForegroundColor green
Write-Host "Dest. dir:" $dst -ForegroundColor green
Write-Host "--------------------------------------------------------------------------------------------------------------------------------------"
Copy-Item -Path $src -Destination $dst -Recurse
#récupération des dossiers écrits pour listage dans logfinal
Get-ChildItem $dst >> "$finallog\$fileName logfinal $fichier" -Recurse -Force
#Gestion des erreurs et écriture dans un logerror
$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 répertoire partagé:
Copy-Item Path $log\$importdata Destination "h:\Organisation Serveurs\log copie nouvelle arborescence" -recurse -ErrorAction SilentlyContinue
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 |