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 |