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
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
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.