it-swarm.com.de

Wie zwinge ich Robocopy, Dateien zu überschreiben?

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
6
tbl

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
17
Ansgar Wiechers

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.

0
Rickz