2016-11-22 10 views
4

Im Allgemeinen ignoriert Robocopy Dateien, die letzte Schreib- und Dateigröße sind gleich. Wie können wir diesem Design entkommen? Ich möchte mit Robocopy das Überschreiben erzwingen.Wie erzwinge ich Robocopy zum Überschreiben von Dateien

Ich erwartete, 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 

Antwort

11

Vom documentation:

/is Enthält die gleichen Dateien.
/it Enthält "optimierte" Dateien.

"Gleiche Dateien" bedeutet Dateien, die identisch sind (Name, Größe, Zeiten, Attribute). "Optimierte Dateien" sind Dateien, die den gleichen Namen, die gleiche Größe und die gleichen Zeiten, aber 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 

This answer auf Super-User hat eine gute Erklärung, welche Art von Dateien der Auswahl Parameter übereinstimmen.

Mit diesem gesagt, könnte ich reproduzieren das Verhalten, das Sie beschreiben, aber von meinem Verständnis der Dokumentation und der Ausgabe robocopy generiert in meinen Tests würde ich dies als einen Fehler betrachten.

PS C:\temp>New-Item src -Type Directory >$null 
PS C:\temp>New-Item dst -Type Directory >$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\ 
      Modified 7 sample.txt 

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

       Total Copied Skipped Mismatch FAILED Extras 
    Dirs :   1   0   0   0   0   0 
    Files :   1   1   0   0   0   0 
    Bytes :   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\ 
      Same 7 sample.txt 

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

       Total Copied Skipped Mismatch FAILED Extras 
    Dirs :   1   0   0   0   0   0 
    Files :   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 aufgeführt sind, und da es eine gleiche Datei nach der erste robocopy Lauf zumindest die Zeiten synchronisiert wird. Obwohl nach der Ausgabe 7 Bytes kopiert wurden, wurden in beiden Fällen trotz gesetzten Datenflags tatsächlich keine Daten in die Zieldatei geschrieben (über /copyall). Das Verhalten ändert sich auch nicht, wenn das Datenflag explizit gesetzt ist (/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 /is /it /copyall /mir 
... 
    Options : /S /E /COPYALL /PURGE /MIR /IS /IT /R:1000000 /W:30 

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

          1 C:\temp\src\ 
100% Newer 7 sample.txt 

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

       Total Copied Skipped Mismatch FAILED Extras 
    Dirs :   1   0   0   0   0   0 
    Files :   1   1   0   0   0   0 
    Bytes :   7   7   0   0   0   0 
... 
PS C:\temp>Get-Content .\dst\sample.txt 
test001

Eine zugegebenermaßen hässliche Abhilfe wäre die letzte Schreibzeit von gleichen/gezwickt Dateien zu ändern robocopy zu zwingen, die Daten zu kopieren:

& 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 

zu xcopy Switching ist wahrscheinlich die beste Wahl:

+0

OK. Ich werde xcopy verwenden. – tbl

0

Ich tat dies für einen Home-Ordner, wo alle Ordner in den Desktops der entsprechenden Benutzer sind, erreichbar über eine Verknüpfung, die nicht haben die entsprechenden Berechtigungen, so dass Benutzer es nicht sehen konnten, selbst wenn es dort war. So habe ich Robocopy mit dem Parameter 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 eine Vielzahl von Dateitypen, die ich festgelegt (für alle Fälle) zu ignorieren, setzen sie einfach Ihre Bedürfnisse für oder Ihre Fallszenario.

Getestet auf Server 2012, ist jeder Schalter in Microsofts Websites und anderen dokumentiert.

+0

Hallo, willkommen in SO. Ich habe deine Antwort bearbeitet, um sie verständlicher zu machen, aber ich bin mir nicht sicher, ob du das meintest. Wie auch immer, Sie haben Ihr Szenario beschrieben (was ich nicht wirklich verstanden habe, tut mir leid), aber Sie haben nicht erklärt, was Ihr Befehl macht, und da es ein komplexer ist, ist es nicht trivial, es herauszufinden. Ich schlage vor, Ihre Antwort zu editieren und mindestens eine allgemeine Beschreibung dessen zu geben, was dieser Befehl macht und wie. Sind Sie außerdem sicher, dass Sie die ursprüngliche Frage beantworten, wie Robocopy gezwungen wird, Dateien zu überschreiben, die identisch aussehen? –

Verwandte Themen