Im Allgemeinen ignoriert Robocopy Dateien, für die lastwrittendate und filesize gleich sind. Wie können wir diesem Entwurf entgehen? Ich möchte das Überschreiben mit Robocopy erzwingen.
Ich habe erwartet, dass dst\sample.txt test001 ..__ geschrieben werden sollte. Diese Dateien werden jedoch von Robocopy als dieselben Dateien erkannt und nicht überschrieben. Die Option "/ IS" ist in diesem Fall nicht wirksam.
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
Aus der Dokumentation :
/is
Enthält die gleichen Dateien./it
Enthält "angepasste" Dateien.
"Gleiche Dateien" bezeichnet Dateien, die identisch sind (Name, Größe, Zeiten, Attribute). "Optimierte Dateien" bezeichnet Dateien, die den gleichen Namen, die gleiche Größe und die gleiche Zeit haben, jedoch unterschiedliche Attribute haben.
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
Diese Antwort auf SuperUser hat eine gute Erklärung, auf welche Art von Dateien die Auswahlparameter passen.
Damit konnte ich das von Ihnen beschriebene Verhalten reproduzieren, aber aufgrund meines Verständnisses der Dokumentation und der in meinen Tests generierten Ausgabe robocopy
würde ich dies als Fehler betrachten.
PS C:\temp> New-Item src -Type-Verzeichnis> $ null PS C:\temp> New-Item dst -Type-Verzeichnis> $ null PS C:\temp> Neues Element src\sample.txt -Typdatei -Value "test001"> $ null PS C:\temp> Neues Element dst\sample.txt -Typdatei -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/ist/it/copyall/mir ... Optionen:/S/E/COPYALL/PURGE/MIR/IS/IT/R: 1000000/W:30 -------------------- -------------------------------------------------- -------- 1 C:\temp\src\ Modifizierte 7 sample.txt ---------------------------------------- ---------------------------------- Gesamt Kopiert Übersprungene Nichtübereinstimmung FAILED Extras Dirs: 1 0 0 0 0 0 Dateien: 1 1 0 0 0 0 Bytes: 7 7 0 0 0 0 ... PS C:\temp> robocopy src dst sample.txt/ist/it/copyall/mir ... Optionen:/S/E/COPYALL/PURGE/MIR/IS/IT/R: 1000000/W:30 -------------------- -------------------------------------------------- -------- 1 C:\temp\src\ Gleiche 7 sample.txt ---------------------------------------- ---------------------------------- Gesamt Kopiert Übersprungene Nichtübereinstimmung FAILED Extras Dirs: 1 0 0 0 0 0 Dateien: 1 1 0 0 0 0 Bytes: 7 7 0 0 0 0 ... PS C:\temp> Get-Content.\Src\sample.txt test001 PS C:\temp> Get-Content.\Dst\sample.txt test002
Die Datei wird als kopiert aufgelistet, und da es sich um eine gleiche Datei handelt, wird after die erste robocopy
-Ausführung ausgeführt, wenn mindestens die Zeiten synchronisiert werden. Obwohl 7 Byte entsprechend der Ausgabe kopiert wurden, wurden in beiden Fällen trotz gesetztem Datenflag (über /copyall
) tatsächlich keine Daten in die Zieldatei geschrieben. Das Verhalten ändert sich auch nicht, wenn das Datenflag explizit gesetzt wird (/copy:d
).
Ich musste die letzte Schreibzeit ändern, um robocopy
zu erhalten, um die Daten tatsächlich zu synchronisieren.
PS C:\temp> Set-ItemProperty src\sample.txt -Name LastWriteTime -Value (Get-Date) PS C:\temp> robocopy src dst sample.txt/ist/it/copyall/mir ... Optionen:/S/E/COPYALL/PURGE/MIR/IS/IT/R: 1000000/W:30 -------------------- -------------------------------------------------- -------- 1 C:\temp\src\ 100% Neuere 7 sample.txt ---------------------------------------- ---------------------------------- Gesamt Kopiert Übersprungene Nichtübereinstimmung FAILED Extras Dirs: 1 0 0 0 0 0 Dateien: 1 1 0 0 0 0 Bytes: 7 7 0 0 0 0 ... PS C:\temp> Get-Content.\Dst\sample.txt test001
Eine hässliche Problemumgehung wäre die Änderung des letzten Schreibzeitpunkts der gleichen/angepassten Dateien, um zu erzwingen, dass robocopy
die Daten kopiert:
& 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
Ein Wechsel zu xcopy
ist wahrscheinlich die beste Option:
& xcopy src dst /k/r/e/i/s/c/h/f/o/x/y
Ich habe dies für einen Home-Ordner getan, in dem sich alle Ordner auf den Desktops der entsprechenden Benutzer befinden. Diese Verknüpfungen sind über eine Verknüpfung erreichbar, die nicht über die entsprechenden Berechtigungen verfügt, sodass Benutzer sie nicht sehen können, auch wenn sie vorhanden sind. Also habe ich Robocopy mit dem Parameter verwendet, um die Datei mit den richtigen Einstellungen zu überschreiben:
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
Wie Sie sehen, gibt es viele Dateitypen, die ich ignorieren möchte (nur für den Fall). Legen Sie sie einfach für Ihre Bedürfnisse oder Ihr Fall-Szenario fest.
Auf Server 2012 getestet, ist jeder Switch auf den Websites von Microsoft und anderen dokumentiert.