web-dev-qa-db-fra.com

Comment forcer Robocopy à écraser des fichiers?

En général, Robocopy ignore les fichiers pour lesquels lastwrittendate et la taille du fichier sont identiques. Comment pouvons-nous échapper à cette conception? J'aimerais forcer l'écrasement avec Robocopy.

Je pensais que dst\sample.txt devrait être écrit test001 . Mais ces fichiers sont reconnus comme étant les mêmes fichiers par Robocopy et non remplacés. L'option "/ IS" n'est pas efficace dans ce cas.

New-Item src -itemType Directory
New-Item dst -itemType Directory
New-Item src\sample.txt -itemType File -Value "test001"
New-Item dst\sample.txt -itemType File -Value "test002"
Set-ItemProperty src\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
Set-ItemProperty dst\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"

ROBOCOPY.exe src dst /COPYALL /MIR
Get-Content src\sample.txt, dst\sample.txt
> test001
> test002

ROBOCOPY.exe src dst /COPYALL /MIR /IS
Get-Content src\sample.txt, dst\sample.txt
> test001
> test002
6
tbl

De la documentation :

/is Inclut les mêmes fichiers.
/it Inclut les fichiers "modifiés". 

"Fichiers identiques" désigne des fichiers identiques (nom, taille, heures, attributs). "Fichiers modifiés" signifie des fichiers qui ont le même nom, la même taille et la même heure, mais des attributs différents.

robocopy src dst sample.txt /is      # copy if attributes are equal
robocopy src dst sample.txt /it      # copy if attributes differ
robocopy src dst sample.txt /is /it  # copy irrespective of attributes

Cette réponse sur SuperUser a une bonne explication sur le type de fichiers auquel les paramètres de sélection correspondent.

Cela dit, je pourrais reproduire le comportement que vous décrivez, mais d'après ma compréhension de la documentation et du résultat robocopy généré lors de mes tests, je considérerais cela comme un bogue.

PS C:\temp> Répertoire de types src New-Item> $ null
 PS C:\temp> Répertoire de types dst New-Item> $ null
 PS C:\temp> New-Item src\sample.txt -Type File -Value "test001"> $ null
 PS C:\temp> New-Item dst\sample.txt -Type File -Value "test002"> $ null
 PS C:\temp> Set-ItemProperty src\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
 PS C:\temp> Set-ItemProperty dst\sample.txt -Name LastWriteTime -Value "2016/1/1 15:00:00"
 PS C:\temp> robocopy src dst sample.txt/is/it/copyall/mir
...
 Options:/S/E/COPYALL/PURGE/MIR/IS/IT/R: 1000000 /W:30

------------------------ -------------------------------------------------- --------

 1 C:\temp\src\
 7 sample.txt modifié

------------------------------------------------ ----------------------------------

 Total Copié    Ignoré les incohérences FAILED Extras 
 Dirs: 1 0 0 0 0 0 
 Fichiers: 1 1          0 0 0 0 
 Octets: 7 7          0 0 0 0 
...
 PS C:\temp> robocopy src dst sample.txt/is/it/copyall/mir
...
 Options:/S/E/COPYALL/PURGE/MIR/IS/IT/R: 1000000 /W:30

------------------------ -------------------------------------------------- --------

 1 C:\temp\src\
 Même 7 sample.txt

------------------------------------------------ ----------------------------------

 Total Copié    Ignoré les incohérences FAILED Extras 
 Dirs: 1 0 0 0 0 0 
 Fichiers: 1 1          0 0 0 0 
 Octets: 7 7          0 0 0 0 
...
 PS C:\temp> Get-Content.\Src\sample.txt
 test001
PS C:\temp> Get-Content.\Dst\sample.txt
 test002

Le fichier est répertorié comme copié et, puisqu'il devient un même fichier après, la première robocopy exécutée au moins, les heures sont synchronisées. Cependant, bien que 7 octets aient été copiés conformément à la sortie, aucune donnée n'a été réellement écrite dans le fichier de destination dans les deux cas, bien que l'indicateur de données ait été défini (via /copyall). Le comportement ne change pas non plus si l'indicateur de données est défini explicitement (/copy:d).

J'ai dû modifier l'heure de la dernière écriture pour que robocopy puisse réellement synchroniser les données.

PS C:\temp> Set-ItemProperty src\sample.txt -Name LastWriteTime -Value (Get-Date)
 PS C:\temp> robocopy src dst sample.txt/is/it/copyall/mir
...
 Options:/S/E/COPYALL/PURGE/MIR/IS/IT/R: 1000000 /W:30

------------------------ -------------------------------------------------- --------

 1 C:\temp\src\
100% plus récent 7 sample.txt

------------------------------------------------ ----------------------------------

 Total Copié    Ignoré les incohérences FAILED Extras 
 Dirs: 1 0 0 0 0 0 
 Fichiers: 1 1          0 0 0 0 
 Octets: 7 7          0 0 0 0 
...
 PS C:\temp> Get-Content.\Dst\sample.txt
 test001

Une solution de contournement certes moche consisterait à modifier la dernière heure d'écriture de fichiers identiques/modifiés pour forcer robocopy à copier les données:

& robocopy src dst /is /it /l /ndl /njh /njs /ns /nc |
  Where-Object { $_.Trim() } |
  ForEach-Object {
    $f = Get-Item $_
    $f.LastWriteTime = $f.LastWriteTime.AddSeconds(1)
  }
& robocopy src dst /copyall /mir

Passer à xcopy est probablement votre meilleure option:

& xcopy src dst /k/r/e/i/s/c/h/f/o/x/y
17
Ansgar Wiechers

Je l'ai fait pour un dossier de base où tous les dossiers sont dans les bureaux des utilisateurs correspondants, accessibles via un raccourci clavier ne disposant pas des autorisations appropriées, afin que les utilisateurs ne puissent pas le voir même s'il était présent. J'ai donc utilisé Robocopy avec le paramètre pour écraser le fichier avec les bons paramètres:

FOR /F "tokens=*" %G IN ('dir /b') DO robocopy  "\\server02\Folder with shortcut" "\\server02\home\%G\Desktop" /S /A /V /log+:C:\RobocopyShortcut.txt /XF *.url *.mp3 *.hta *.htm *.mht *.js *.IE5 *.css *.temp *.html *.svg *.ocx *.3gp *.opus *.zzzzz *.avi *.bin *.cab *.mp4 *.mov *.mkv *.flv *.tiff *.tif *.asf *.webm *.exe *.dll *.dl_ *.oc_ *.ex_ *.sy_ *.sys *.msi *.inf *.ini *.bmp *.png *.gif *.jpeg *.jpg *.mpg *.db *.wav *.wma *.wmv *.mpeg *.tmp *.old *.vbs *.log *.bat *.cmd *.Zip /SEC /IT /ZB /R:0

Comme vous le voyez, il y a beaucoup de types de fichiers que je dois ignorer (juste au cas où), il vous suffit de les définir pour vos besoins ou votre scénario.

Testé sur le serveur 2012, chaque commutateur est documenté dans les sites Microsoft et autres.

0
Rickz