Synchroniser des dossiers avec Powershell

Voici un exemple simple de synchronisation de deux dossiers avec Powershell. À noter que cette exemple ne gère pas la suppression. Si un fichier est supprimé dans un des dossiers, il sera recréé lors de la synchronisation suivante.

$sourceRacine = "C:\Test\Dossier1"
$destinationRacine = "C:\Test\Dossier2"
# On indique l'option PassThru pour avoir accès à toutes les propriétés (FullName, CreationTime ...) de l'objet dossier/fichier
$differences = Compare-Object -ReferenceObject (ls $sourceRacine -Recurse) -Difference (ls $destinationRacine -Recurse) -Property Length -PassThru
foreach ($difference in $differences) {
  $source = $difference.FullName
  If ($difference.SideIndicator -eq "=>") {
    # Fichier/dossier présent dans la destination pas la source
    $destination = Join-Path $sourceRacine -ChildPath ($difference.Fullname -replace [regex]::Escape($destinationRacine), "")
  } Else {
    $destination = Join-Path $destinationRacine -ChildPath ($difference.Fullname -replace [regex]::Escape($sourceRacine), "")
  }

  If ((Test-Path $destination) -and (Get-Date ((Get-Item $destination).LastWriteTime)) -gt (Get-Date $difference.LastWriteTime)) {
    # Si le fichier existe dans la destination et qu'il a une date plus récente, on ne copie pas
    continue
  }

  # On crée tout d'abord l'arborescence où se trouve le fichier, si elle n'existe pas
  $dossier = $destination -replace "$([regex]::Escape($difference.Name))\\?", ""
  If (-Not (Test-Path $dossier)) {
    New-Item $dossier -ItemType Directory
  }
  # Copie du fichier et des dates de création/modification pour qu'elles coïncident
  $nouveauFichier = Copy-Item -Path $source -Destination $destination -PassThru
  $nouveauFichier.CreationTime = $difference.CreationTime
  $nouveauFichier.LastWriteTime = $difference.LastWriteTime
}

D’autres infos :