PowerShell : lancer plusieurs robocopy en parallèle

Dans cet article, je vous propose un script qui va vous permettre de lancer plusieurs Robocopy simultanément, qui permet de gagner beaucoup de temps lors de l’utilisation de robocopy sur un dossier ayant plusieurs sous dossiers.

Le script :

###
#
# This script runs robocopy jobs in parallel by increasing the number of outstanding i/o's to the VPSA. Even though you can
# change the number of threads using the "/mt:#" parameter, your backups will run faster by adding two or more jobs to your
# original set. 
#
# To do this, you need to subdivide the work into directories. That is, each job will recurse the directory until completed.
# The ideal case is to have 100's of directories as the root of the backup. Simply change $src to get
# the list of folders to backup and the list is used to feed $ScriptBlock.
# 
# For maximum SMB throughput, do not exceed 8 concurrent Robocopy jobs with 20 threads. Any more will degrade
# the performance by causing disk thrashing looking up directory entries. Lower the number of threads to 8 if one
# or more of your volumes are encrypted.
#
# Parameters:
# $src Change this to a directory which has lots of subdirectories that can be processed in parallel 
# $dest Change this to where you want to backup your files to
# $max_jobs Change this to the number of parallel jobs to run ( <= 8 )
# $log Change this to the directory where you want to store the output of each robocopy job.
#
####
#
# This script will throttle the number of concurrent jobs based on $max_jobs
#
$max_jobs = 8
$tstart = get-date
#
# Set $src to a directory with lots of sub-directories
#
$src = "D:\Partages\"
#
# Set $dest to a local folder or share you want to back up the data to
#
$dest = "\\srv-target\D$\Partages\"
#
# Set $log to a local folder to store logfiles
#
$log = "C:\Temp\"
$files = ls $src
$files | %{
$ScriptBlock = {
param($name, $src, $dest, $log)
$log += "\$name-$(get-date -f yyyy-MM-dd-mm-ss).log"
robocopy $src$name $dest$name /R:1 /W:1 /COPYALL /E /XF *.tmp *.bak /mt:8 /ndl > $log
Write-Host $src$name " completed"
 }
$j = Get-Job -State "Running"
while ($j.count -ge $max_jobs) 
{
 Start-Sleep -Milliseconds 500
 $j = Get-Job -State "Running"
}
 Get-job -State "Completed" | Receive-job
 Remove-job -State "Completed"
Start-Job $ScriptBlock -ArgumentList $_,$src,$dest,$log
 }
#
# No more jobs to process. Wait for all of them to complete
#

While (Get-Job -State "Running") { Start-Sleep 2 }
Remove-Job -State "Completed" 
  Get-Job | Write-host

$tend = get-date

new-timespan -start $tstart -end $tend

Copier le code PowerShell ci-dessous et coller dans un fichier avec l’extension ps1.

Personnalisation le script

Ligne 30 : Emplacement du dossier source.

$src = "D:\Partages\"

Ligne 34 : Emplacement du dossier de destination (local ou partage réseau).

$dest = "\\srv-target\D$\Partages\"

Ligne 38 : Emplacement des logs robocopy.

$log = "C:\Temp\"

Ligne 44 : Appel de la commande robocopy, ajouter ou supprimer des paramètres comme l’exclusion de fichiers, dossiers …

robocopy $src$name $dest$name /R:1 /W:1 /COPYALL /E /XF *.tmp *.bak /mt:8 /ndl > $log

Sources : https://support.zadarastorage.com/hc/en-us/articles/213024806-How-to-Run-Robocopy-in-Parallel



Related Posts


Vembu : installation et configuration pour Hyper-V

Vembu est éditeur de logiciel de sauvegarde, qui propose Vembu BDR Suite une solution de sauvegarde multiplate-formes. Contexte Pour la réalisation de ce tutoriel j'ai utilisé un Windows 2016 avec le

Active Directory : joindre un ordinateur à un domaine en ligne de commande

Introduction La jonction au domaine Active Directory d'un ordinateur peut être effectué soit à l'aide l'interface graphique ou à l'aide de ligne de commande et PowerShell. Dans ce tutoriel, je vais vo

Veeam Agent : installation et configuration

Veeam Agent est un utilitaire de sauvegarde qui s'installe directement sur le poste à sauvegarder. Il peut être utilisé pour faire la sauvegarde d'ordinateur physique ou virtuel. Coupler à la console