Ce script créé par mes soins permet de copier des dossiers en masse sur un espace de stockage avec la création d'un fichier qui log les actions effectuées.
Fonctionnalités :
- Copier des dossiers sur un espace de stockage
- Création d'un fichier de logs horodatés (Copy-File)
Ce script utilise Robocopy (ou Robust File Copy) qui est un utilitaire en ligne de commande permettant de faire de la réplication de dossiers et fichiers. Cet utilitaire a été introduit dans le "Resource Kit" de Windows Server 2003 et est intégré par défaut à Windows depuis Windows Server 2008 et Windows Vista, il est présent sur toute les versions suivantes que ce soit les versions poste de travail (Windows 7, 8, 8.1 et 10) ou les versions serveur (Windows Server 2008 R2, 2012, 2012 R2). Il est ainsi totalement GRATUIT.
La dernière version de Robocopy est la version 6.2 qui est fourni depuis Windows 8 et Windows Server 2012.
Robocopy est comparable à la commande XCOPY mais possède plus d'options qui offrent plus de possibilités pour la configuration de scripts de réplication ou sauvegarde.
Robocopy possède de nombreuses fonctionnalités qui sont très appréciées car elle sont supérieures aux commandes internes COPY ou XCOPY de Windows, en particulier :
- Une tolérance aux coupures réseau et une reprise une fois la connexion rétablie
- La conservation des attributs et des informations d'appartenances des fichiers ou dossiers (créateur, propriétaire, ACL NTFS, informations d'audit)
- Un mode "mirroir" qui permet de mettre en place une synchronisation entre l'emplacement source et l'emplacement de destination
- Une copie différentielle qui ne copie que les fichiers n'existant pas sur l'emplacement de destination (vérification grâce à la taille et aux métadonnées des fichiers)
- Un indicateur de progression dans l'invite de commande
- Des copies effectuées en parallèle (multithread, disponible depuis WIndows 7)
Documentation complète :
-------------------------------------------------------------------------------
ROBOCOPY :: Copie de fichiers robuste pour Windows
-------------------------------------------------------------------------------
Début : Tue Jun 13 22:39:55 2017
Syntaxe :: ROBOCOPY source destination [fichier [fichier]...] [options]
source :: répertoire source (lecteur:\chemin ou \\serveur\partage\chemin).
destination :: rép. de destination (lecteur:\chemin ou \\serveur\partage\chemin).
fichier :: fichier(s) à copier (noms/caractères génériques : valeur par défaut "*.*").
::
:: Options de copie :
::
/S :: copie les sous-répertoires non vides uniquement.
/E :: copie les sous-répertoires, y compris les vides.
/LEV:n :: copie uniquement les n premiers niveaux de l’arborescence source.
/Z :: copie les fichiers en mode de redémarrage.
/B :: copie les fichiers en mode de sauvegarde.
/ZB :: utilise le mode de redémarrage ; si l’accès est refusé, utilise le mode de sauvegarde.
/EFSRAW :: copie tous les fichiers chiffrés en mode EFS RAW.
/COPY:indicateurscopie :: spécifie les éléments à copier pour les fichiers (/COPY:DAT par défaut).
(indicateurscopie : D=Données, A=Attributs, T=horodaTages).
(S=Sécurité=ACL NTFS, O=infos prOpriétaire, U=infos d’aUdit).
/DCOPY:T :: copie les horodatages de répertoire.
/SEC :: copie des fichiers avec sécurité (équivaut à /COPY:DATS).
/COPYALL :: copie toutes les infos de fichiers (équivaut à /COPY:DATSOU).
/NOCOPY :: ne copie aucune info de fichier (utile avec /PURGE).
/SECFIX :: corrige la sécurité de tous les fichiers, même les fichiers ignorés.
/TIMFIX :: corrige les horodatages de tous les fichiers, même les fichiers ignorés.
/PURGE :: supprime les fichiers/répertoires de destination qui n’existent plus dans la source.
/MIR :: met en MIRoir une arborescence (équivaut à /E plus /PURGE).
/MOV :: déplace les fichiers (les supprime de la source après la copie).
/MOVE :: déplace les fichiers ET les répertoires (les supprime de la source après la copie).
/A+:[RASHCNET] :: ajoute les Attributs donnés aux fichiers copiés.
/A-:[RASHCNET] :: supprime les Attributs donnés des fichiers copiés.
/CREATE :: crée une arborescence et des fichiers de longueur nulle uniquement.
/FAT :: crée des fichiers de destination au format de nom 8.3 FAT uniquement.
/256 :: désactive la prise en charge des chemins d’accès très longs (> 256 caractères).
/MON:n :: source du moniteur ; réexécuté lorsque plus de n modifications sont observées.
/MOT:m :: source du moniteur ; réexécuté après m minutes en cas de modification.
/RH:hhmm-hhmm :: heures d’exécution : heures auxquelles de nouvelles copies peuvent être lancées.
/PF :: vérifie les heures d’exécution Par Fichier (et non par passage).
/IPG:n :: délai entre les paquets (ms) pour libérer la bande passante sur les lignes bas débit.
/SL:: copie les liens symboliques par opposition à la cible.
/MT[:n] :: Effectuer des copies multi-thread avec n threads (par défaut, 8).
n doit être au moins égal à 1 et pas supérieur à 128.
Cette option est incompatible avec les options /IPG et /EFSRAW.
Rediriger la sortie avec l’option /LOG pour de meilleures performances.
::
:: Options de sélection des fichiers :
::
/A :: copie uniquement les fichiers où l’attribut Archive est défini.
/M :: copie uniquement les fichiers où l’attribut Archive est défini et le réinitialise.
/IA:[RASHCNETO] :: Inclut uniquement les fichiers où l’un des Attributs donnés est défini.
/XA:[RASHCNETO] :: eXclut les fichiers où l’un des Attributs donnés est défini.
/XF fichier [fichier]... :: eXclut les fichiers correspondant aux noms/chemins/caractères génériques donnés.
/XD répertoires [répertoires]... :: eXclut les répertoires correspondant à des noms/chemins donnés.
/XC :: eXclut les fichiers Changés.
/XN :: eXclut les fichiers Nouveaux.
/XO :: eXclut les fichiers anciens.
/XX :: eXclut les fichiers et répertoires supplémentaires.
/XL :: eXclut les fichiers et répertoires solitaires.
/IS :: Inclut les mêmeS fichiers.
/IT :: Inclut les fichiers optimisés.
/MAX:n :: taille de fichier maximale : exclut les fichiers de taille supérieure à n octets.
/MIN:n :: taille de fichier minimale : exclut les fichiers de taille inférieure à n octets.
/MAXAGE:n :: Antériorité maximale du fichier : exclut les fichiers plus anciens que n jours/qu’une date n.
/MINAGE:n :: Antériorité minimale du fichier : exclut les fichiers plus récents que n jours/qu’une date n.
/MAXLAD:n :: dernière date d’accès MAXimale : exclut les fichiers inutilisés depuis n.
/MINLAD:n :: dernière date d’accès MINimale : exclut les fichiers utilisés depuis n.
(si n < 1900, alors n = n jours, sinon n = date JJMMAAA).
/XJ :: eXclut les points de Jonction (normalement inclus par défaut).
/FFT :: suppose des heures de fichier FAT (granularité de 2 secondes).
/DST :: compense les différences d’heure d’été d’une heure.
/XJD :: eXclut les points de Jonction pour les répertoires.
/XJF :: eXclut les points de Jonction pour les Fichiers.
::
:: Options de nouvelle tentative :
::
/R:n :: nombre de tentatives après l’échec de copies : 1 million par défaut.
/W:n :: délai entre les tentatives : 30 secondes par défaut.
/REG :: enregistre /R:n et /W:n comme paramètres par défaut dans le Registre.
/TBD :: attend la détermination des noms de partage (erreur de nouvelle tentative 67).
::
:: Options d’enregistrement dans le journal :
::
/L :: Liste uniquement : pas de copie, d’horodatage ou de suppression de fichiers.
/X :: signale tous les fichiers supplémentaires et pas uniquement ceux sélectionnés.
/V :: produit un résultat détaillé en affichant les fichiers ignorés.
/TS :: inclut les horodaTageS des fichiers sources dans le résultat.
/FP :: inclut le chemin d’accès complet des fichiers dans le résultat.
/BYTES :: affiche les tailles en octets.
/NS :: pas de taille : n’enregistre pas les tailles de fichier.
/NC :: pas de classe : n’enregistre pas les classes de fichier.
/NFL :: pas de liste de fichiers : n’enregistre pas les noms de fichiers.
/NDL :: pas de liste de répertoires : n’enregistre pas les noms de répertoire.
/NP :: pas de compteur de progression : n’affiche pas le pourcentage copié.
/ETA :: affiche l’heure de fin estimée de la copie des fichiers.
/LOG:fichier :: copie le statut dans le fichier journal (remplace le journal existant).
/LOG+:fichier :: copie le statut dans le fichier journal (ajoute au journal existant).
/UNILOG:fichier :: copie le statut dans le fichier journal en Unicode (remplace le journal existant).
/UNILOG+:fichier :: copie le statut dans le fichier journal en Unicode (ajoute au journal existant).
/TEE :: résultat dans la fenêtre de la console et dans le fichier journal.
/NJH :: pas d’en-tête de tâche.
/NJS :: pas de résumé de tâche.
/UNICODE :: sortie au format UNICODE.
::
:: Options de tâche :
::
/JOB:NomTâche :: prend les paramètres du fichier de tâche nommé.
/SAVE:NomTâche :: enregistre les paramètres dans le fichier nommé
/QUIT :: arrête après traitement de la ligne de commande (pour afficher les paramètres).
/NOSD :: aucun répertoire source spécifié.
/NODD :: aucun répertoire de destination spécifié.
/IF :: Inclut les fichiers suivants.
Utilisation :
- Compléter les variables suivantes dans le script :
- $Source = "D:\Scripts\Copy-File\Stockage" (Dossier qui contient les données à copier)
- $Destination = "D:\Scripts\Copy-File\Archivage" (Dossier de destination)
Screenshot :
Code du script :
<#
.SYNOPSIS
Copy existing files
.DESCRIPTION
Copy multiple files on a shared folder
.NOTES
File name : Copy-File.ps1
Author : Pierre JACQUOT
Date : 13/06/2017
Version : 1.0
.LINK
Website : https://www.pierrejacquot.yo.fr
Reference : https://www.pierrejacquot.yo.fr/index.php/scripts/35-script-copy-file-v1-0
#>
Clear-Host
chcp 1252 | Out-Null
$StartTime = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
[string]$Hostname = [Environment]::MachineName
[string]$Login = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
[string]$Workfolder = Split-Path $MyInvocation.MyCommand.Path
[string]$Date = Get-Date -UFormat "%Y-%m-%d"
[string]$Source = "D:\Scripts\Copy-File\Stockage"
[string]$Destination = "D:\Scripts\Copy-File\Archivage"
[string]$LogFile = $Workfolder + "\$Date-Copy-File.log"
[array]$Items = Get-ChildItem -Path $Source -Recurse
[int]$ItemsNumbers = $Items.Count
Write-Host "Copy-File :" -ForegroundColor Black -BackgroundColor Yellow
Write-Host "Launching the copy of [$ItemsNumbers] item(s)." -ForegroundColor Cyan
Robocopy $Source $Destination /MIR /V /TS /FP /ETA /LOG+:$LogFile /TEE
If ($LASTEXITCODE -eq 0) {
Write-Host "`r"
Write-Warning "No files were copied. No failure was encountered. No files were mismatched. The files already exist in the destination directory; therefore, the copy operation was skipped."
}
ElseIf ($LASTEXITCODE -gt 8) {
Write-Host "`r"
Write-Host "Error during processing copy." -ForegroundColor Red
}
Else {
Write-Host "`r"
Write-Host "All files were copied successfully." -ForegroundColor Green
}
$EndTime = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
[decimal]$Duration = [math]::Round((New-TimeSpan -Start $StartTime -End $EndTime).TotalSeconds,2)
Write-Host "`r"
Write-Host "Script launched from : " -NoNewline; Write-Host $Hostname -ForegroundColor Red
Write-Host "By : " -NoNewline; Write-Host $Login -ForegroundColor Red
Write-Host "Path : " -NoNewline; Write-Host $Workfolder -ForegroundColor Red
Write-Host "Log file : " -NoNewline; Write-Host (Split-Path $LogFile -Leaf) -ForegroundColor Red
Write-Host "Start time : " -NoNewline; Write-Host $StartTime -ForegroundColor Red
Write-Host "End time : " -NoNewline; Write-Host $EndTime -ForegroundColor Red
Write-Host "Duration : " -NoNewline; Write-Host $Duration -ForegroundColor Red -nonewline; Write-Host " seconds"
Write-Host "`r"
Exemple du fichier Copy-File.log
créé automatiquement avec les items copiés sur l'espace de stockage :
------------------------------------------------------------------------------- ROBOCOPY :: Copie de fichiers robuste pour Windows ------------------------------------------------------------------------------- Début : samedi 9 mai 2020 18:02:54 Source : C:\Scripts\Copy-File\Stockage\ Dest : C:\Scripts\Copy-File\Archivage\ Fichiers : *.* Options : *.* /V /TS /FP /TEE /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /ETA /R:1000000 /W:30 ------------------------------------------------------------------------------- 0 C:\Scripts\Copy-File\Stockage\ Nouveau rép. 1 C:\Scripts\Copy-File\Stockage\Pierre\ Nouveau fichier 100.0 m 2017/06/13 20:09:52 C:\Scripts\Copy-File\Stockage\Pierre\Fichierde100Mo.txt 0.0% 1.0% 2.0% 3.0% 4.0% 5.0% 6.0% 7.0% 8.0% 9.0% 10.0% 11.0% 12.0% 13.0% 14.0% 15.0% 16.0% 17.0% 18.0% 19.0% 20.0% 21.0% 22.0% 23.0% 24.0% 25.0% 26.0% 27.0% 28.0% 29.0% 30.0% 31.0% 32.0% 33.0% 34.0% 35.0% 36.0% 37.0% 38.0% 39.0% 40.0% 41.0% 42.0% 43.0% 44.0% 45.0% 46.0% 47.0% 48.0% 49.0% 50.0% 51.0% 52.0% 53.0% 54.0% 55.0% 56.0% 57.0% 58.0% 59.0% 60.0% 61.0% 62.0% 63.0% 64.0% 65.0% 66.0% 67.0% 68.0% 69.0% 70.0% 71.0% 72.0% 73.0% 74.0% 75.0% 76.0% 77.0% 78.0% 79.0% 80.0% 81.0% 82.0% 83.0% 84.0% 85.0% 86.0% 87.0% 88.0% 89.0% 90.0% 91.0% 92.0% 93.0% 94.0% 95.0% 96.0% 97.0% 98.0% 99.0% 100% ------------------------------------------------------------------------------- Total Copié IgnoréDiscordance ÉCHEC Extras Rép : 2 1 1 0 0 0 Fichiers : 1 1 0 0 0 0 Octets : 100.00 m 100.00 m 0 0 0 0 Heures: 0:00:01 0:00:01 0:00:00 0:00:00 Débit : 74525657 Octets/sec. Débit : 4264.392 Méga-octets/min. Fin : samedi 9 mai 2020 18:02:56
Cliquer ici pour télécharger le script.