Robocopy kopiert den Stammordner und seinen Zeitstempel nicht

10

Robocopy kopiert nicht den Stammordner und seinen Zeitstempel - es kopiert alle Unterverzeichnisse und Dateien (wenn die entsprechenden Optionen festgelegt sind) und es scheint keine Option / kein Argument zu geben, um Robocopy mitzuteilen, dass Sie den Stammordner selbst und seinen Zeitstempel oder seine Attribute möchten auch wörtlich kopiert werden.

Sagen Sie also, ich möchte C: / Brushes kopieren

Robocopy kopiert alle Unterverzeichnisse und Dateien in das Ziel, jedoch nicht in den Pinselordner selbst mit allen zugehörigen Attributen und dem Zeitstempel.

Verstehst du was ich frage? Dies ist ziemlich einfach und Robocopy scheint keine Option dafür zu haben. Die Leute haben die Frage schon einmal in verschiedenen Foren gestellt, aber meiner Meinung nach hat niemand die Frage beantwortet.

Geben Sie hier die Bildbeschreibung ein

ptrcao
quelle
1
Dies ist ein Flyer, basierend auf meinen Erfahrungen mit rsync, aber was ist, wenn Sie am Ende Ihres Zielordners keinen abschließenden Schrägstrich haben? Wie wäre es mit dem Versuch, das Skript auf Befehlszeilenebene zu ändern, anstatt die GUI zu verwenden? Ich weiß, dass das Befehlszeilentool genau das tut, was Sie brauchen.
@ Randolph West: Derzeit habe ich keinen abschließenden Schrägstrich am Ende des Zielordners. Ich kann Robocopy immer noch nicht dazu bringen, den Quellordner und seine Attribute usw. in den eigentlichen Kopierauftrag aufzunehmen. Irgendwelche Ideen?
Ptrcao
Wenn es keine Lösung für Robocopy gibt , können Sie sich xxcopy ansehen (es gibt Freeware- und kommerzielle Versionen).
Harrymc
Ja, ich verstehe das vollkommen und habe unten eine funktionierende Lösung hinzugefügt. Das eigentliche Problem ist, dass Sie alle Dateien und Ordner im Stammverzeichnis angeben müssen, um NICHT zu kopieren.
Opsin

Antworten:

9
robocopy %1 "C:\DestinationDirectory\%~n1" /E /V /DCOPY:T /LOG:"C:\DestinationDirectory\Copied.txt" /R:10 /W:30 

Legen Sie einen Ordner auf batoder verwenden Sie in Senden an . Es wird ein Ordner mit Name und Zeitstempel des Quellverzeichnisses erstellt und alle Dateien kopiert.

Terence
quelle
Vielen Dank, war auf der Suche nach diesem magischen% ~ n1 Operator
hotzen
@hotzen, was macht das %~n1?
Pacerier
"Erweitert% 1 zu einem Dateinamen."
Hotzen
Microsoft hat alle ihre Links gebrochen, hier hat die prozentuale Tilde-Dokumentation für Batch, en.wikibooks.org/wiki/Windows_Batch_Scripting#Percent_tilde
kevinf
3

Ich stimme dem OP zu, dass es ein großes Manko der Robokopie ist, den Stammordner nicht kopieren zu können. Wie wäre es, wenn Sie den Pinselordner betrügen und in einen temporären Ordner verschieben, den Robocopy-Vorgang für den temporären Ordner ausführen und ihn dann zurück verschieben?

Etwas wie:

md "c:\verytemporary" && move "c:\brushes" "C:\verytemporary"||( echo Line 1 error occurred & goto :eof )
robocopy c:\verytemporary d:\ /MIR /DCOPY:T
move "c:\verytemporary\brushes" "c:\" && rd /q "c:\verytemporary"||echo Line 3 error occurred
Jimadine
quelle
2

Versuchen Sie es md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushesüber die Befehlszeile und ersetzen Sie die richtigen Pfade.

ctype.h
quelle
2
Ja, aber Sie erstellen einen neuen Ordner, der nicht die Attribute des ursprünglichen C: \ Pinsel-Ordners enthält ...?
Ptrcao
2

Da ich in keiner der Antworten eine gute und einfache Lösung sehen kann:

Wenn es keine Lösung für Robocopy gibt , können Sie sich xxcopy ansehen (es gibt Freeware- und kommerzielle Versionen).

Es gibt natürlich viele andere Alternativen zur Robokopie, einige sind hier aufgelistet .
Siehe auch Bestes Dienstprogramm zum kostenlosen Kopieren von Dateien .

harrymc
quelle
1
xxcopyist ein großartiges Dienstprogramm, aber die Freeware-Version verfügt über eine Eingabeaufforderung, auf die Sie reagieren müssen, wenn Sie eine große Liste von Befehlszeilenoptionen verwenden. Bei Verwendung xxcopyüber ein Befehlsfenster ist diese zusätzliche Eingabeaufforderung irritierend. Aber es verhindert (erschwert) die Verwendung xxcopyeiner Batch-Datei überhaupt.
Kevin Fegan
1

Die Antwort von user105198 ist auf halbem Weg,

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes wird in der Tat nur einen neuen Ordner erstellen. Sie brauchen append / MIR und / Dcopy: T , um es

Wenn mit der Option / mir das Zielverzeichnis vorhanden ist, werden die Sicherheitseinstellungen des Zielverzeichnisses überschrieben. Technet

/DCOPY:T :: COPY Directory Timestamps.

Zusammen bedeutet dies: Die Attribute und Zeitstempel des Quellverzeichnisses werden in den erstellten Ordner gespiegelt.

damit:

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes /MIR /DCOPY:T

quelle
1

Ich denke, Sie werden feststellen, dass Robocopy genau das tut, was Sie wollen, vorausgesetzt, Sie weisen es an, Ordner-Zeitstempel (/ DCOPY: T) zu kopieren. Bei meinen Experimenten habe ich festgestellt, dass das folgende (scheinbar nicht dokumentierte) Verhalten für Robocopy zutrifft:

Alle angegebenen Eigenschaften des Quellverzeichnisses werden auf das Zielverzeichnis angewendet, unabhängig davon, ob das Zielverzeichnis vorhanden ist, nicht vorhanden ist oder einen anderen Namen als das Quellverzeichnis hat.

Die angegebenen Eigenschaften können (mindestens) die Sicherheitsinformationen (/ SEC) oder Ordnerzeitstempel (/ DCOPY: T) enthalten.

Daher werden im folgenden Beispiel dem Ordner c: \ destination \ dieselben Zeitstempel zugewiesen wie dem Ordner c: \ source \.

robocopy c:\source\folder C:\destination\folder /E /DCOPY:T

Ich habe dies mit den Versionen von Robocopy getestet, die in Windows 7, Windows 8 und dem Windows 2003 Resource Kit enthalten sind (nur Parameter / SEC). Beachten Sie, dass nur neuere Versionen von Robocopy (XP026 und höher) den Parameter / DCOPY: T unterstützen.

btriffles
quelle
0

Wenn Sie kombinieren /IF :: Include the following Files.mit /E :: copy subdirectories, including Empty ones.Ihnen bekommen ( in der Nähe) , um den gewünschten Effekt:

C:\Temp\Robocopy Source Root>robocopy . "C:\Temp\Robocopy Destination" /E /IF "Brushes*"
ta.speot.is
quelle
1
Was meinst du mit "nah"? Was ist die Einschränkung, die Sie implizieren?
ptrcao
Gefahr wird Robinson !!! Ihr Vorschlag scheint jeden Ordner im aktuellen Ordner zu kopieren und nicht auf die Ordner zu beschränken, die mit "Brushes" beginnen
GlennFromIowa
0

Robocopy ist nicht wirklich dafür ausgelegt. Es gibt jedoch einen Weg.

Der Stammordner enthält beispielsweise 50 Dateien und 40 Ordner. Sie möchten nur Ordner X (aber Sie möchten auch den Zeit- und Datumsstempel).

ROBOCOPY c:\ d:\ /XF 50 root file names c:\boot.ini c:\bla.txt etc. /XD c:\windows c:\drivers c:\temp etc. /S /E /SEC /DCOPY:T

Das / DCOPY: T weist es an, die Ordnerzeitstempel beizubehalten. / XF gibt an, welche Dateien NICHT kopiert werden sollen, / XD gibt an, welche Ordner NICHT kopiert werden sollen. Geben Sie einfach nicht den Ordner c: \ X an.

Der Hauptnachteil dabei ist, alle Ordner und Dateinamen im Stammverzeichnis zu untersuchen und sie hier speziell aufzurufen. Wenn Sie dies häufig auf verschiedenen Systemen tun, kann ein Skript geschrieben werden.

Arbeitsbeispiel

Robokopie c: \ Test c: \ abc / XF c: \ Test \ Testing.txt / XD "C: \ Test \ Neuer Ordner (2)" "C: \ Test \ Neuer Ordner (3)" / S / E / SEC / DCOPY: T.

Root-Arbeitsbeispiel

Robokopie c: \ d: \ / XF c: \ Testing.txt / XD "C: \ Neuer Ordner (2)" "C: \ Neuer Ordner (3)" / S / E / SEC / DCOPY: T.

Mein Test hat funktioniert, ich habe ein paar Ordner und Unterordner erstellt, c: \ testing war in diesem Fall root, c: \ abc war root eines anderen Laufwerks (offensichtlich sind sie nicht wirklich, aber für diesen Zweck sollte es Sinn machen). Der Ordner, den ich vom Stammverzeichnis haben wollte, hieß "Neuer Ordner", wie Sie sehen, habe ich ihn in / XD nicht angegeben. Stellen Sie außerdem sicher, dass Sie das c: \ angeben. Andernfalls sind die von Ihnen verwendeten Namen global. Mit anderen Worten, wenn ich c: \ testing in aus der Datei Testing.txt nicht angegeben hätte, würde es in ALLEN zu kopierenden Unterordnern weggelassen. Die / SEC kopiert alle Dateisicherheits- und Zeitstempel.

Opsin
quelle
Hmmm, ich nehme an, Sie könnten / XF c: *. * Verwenden, um alle Root-Dateien auszuschließen. Ich werde das testen, wenn ich vor einer Maschine und nicht am Telefon bin.
Opsin
Nein, c: *. * Ist ungültig, Sie müssen alle Dateien manuell auflisten.
Opsin
0

Theoretisch sollte die Verwendung /DCOPY:Talle Ihre Probleme lösen.

Aber ich habe gesehen, dass dies passiert ist, und ich bin nicht sicher, ob ich es einen "Fehler" nennen würde, sondern eher eine Folge der Abfolge der Operationen (OK, Fehler).

Dieser Befehl sollte funktionieren, um alle Dateien von C:\Brushesnach zu kopieren D:\NEWBrushes, und /DCOPY:Tsollte bewirken, dass die Zeitstempel des Quellordners in den Zielordner kopiert werden:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

Was ich gesehen habe (zumindest bei einigen Versionen von Robocopy), ist, dass der Befehl erfolgreich ist, aber der Zeitstempel des D:\NEWBrushesOrdners auf das aktuelle Datum und die aktuelle Uhrzeit gesetzt ist.

Es scheint also, dass die /DCOPY:TFunktion für den "obersten" (obersten) Ordner, den Sie kopieren, nicht funktioniert.

Ich glaube, dass es funktioniert, aber dass der Zeitstempel des Zielordners von Operationen "betreten" wird, die sich später in der Operationssequenz befinden.

Was ich glaube, passiert für diesen Befehl:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

ist so etwas wie:

  1. Ordner erstellen, D:\NEWBrushesfalls noch nicht vorhanden
  2. Kopieren Sie den Zeitstempel von C:\BrushesnachD:\NEWBrushes
  3. Kopieren Sie Dateien und Unterordner von C:\BrushesnachD:\NEWBrushes

Es scheint, dass in Schritt 3 durch die Änderung des Inhalts des Ordners D:\NEWBrushesder Zeitstempel von D:\NEWBrushesgeändert wird.

Für mich bestand die "Problemumgehung" darin, den robocopyBefehl zum Kopieren der Dateien und Ordner auszuführen und dann den (gleichen) robocopyBefehl ein zweites Mal auszuführen .

Also, das erste Mal, wenn Sie laufen:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

Alle Dateien und Ordner werden kopiert. Dann nochmal laufen lassen:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T
  (or)
robocopy "C:\Brushes" "D:\NEWBrushes" /DCOPY:T

Beim zweiten robocopyAusführen werden keine Dateien oder Ordner D:\NEWBrushesdarin geändert, und die /DCOPY:TOption weist robocopyan, den Zeitstempel von C:\Brushesnach zu kopieren D:\NEWBrushes(es sei denn, es gibt Ordner / Dateien C:\Brushes, die sich seit dem ersten Durchlauf von geändert haben robocopy).

Kevin Fegan
quelle
-1

Ich habe gerade die Stammordner für ein wirklich schnelles und einfaches Backup-Skript mit Robocopy gelöst. Es gibt ein Beispiel. Sollte jedem helfen:

$Destination="F:\Backup" #change destionation backup drive and foder
$BackupDirs="d:\folder1", "d:\folder2", "d:\folder3\subfolder", "d:\fodler4\subfolder\subsubfodler" #change source folders

#make a loop for every source folder
foreach ($Backup in $BackupDirs) {

#split folder name
$fdname = Split-Path $Backup -leaf

#define folder to create in destionation
$dirtocreate = Join-Path $Destination $fdname

#make directory, yes, some extra script to skip when exist should be in place, but -erroraction solved this in lazy mode :)
md $dirtocreate -ErrorAction SilentlyContinue 

#copy with subfolders and log
robocopy $backup $dirtocreate  /s /nfl /ndl /log:c:\scripts\backup.log

}
Milhauzz
quelle
Verwenden Sie also dieses PowerScript und das Problem ist behoben, oder?
Pimp Juice IT