
Ich habe einen Prozess, der etwa einmal im Monat ausgeführt wird. Ein solcher Prozess identifiziert eine Reihe von Dateien und erstellt einen geeigneten Quell- und Zielpfad aus mehreren Feldern verschiedener Tabellen in der Datenbank, um dann alle diese Dateien zu kopieren. Am Ende habe ich also möglicherweise Hunderttausende oder Millionen von Pfaden. Es ist möglich, dass diese Pfade auf eine Datei verweisen, die zuvor kopiert, aber geändert wurde.
Wie kann ich diese Kopie möglichst schnell durchführen?
Ich habe zunächst ein einfaches, großes cmd-Skript ausprobiert, das prüft, ob die Datei laut resultierendem Pfad im Zielpfad vorhanden ist, und dann versucht, sie zu kopieren, wenn sie nicht vorhanden ist, aber die geänderten Dateien wurden übersprungen. Dann habe ich versucht, „xcopy“ zu verwenden, um ein Überschreiben zu vermeiden, wenn das Datum gleich ist, indem ich die Schalter /D und /Y verwendet habe, um die Eingabeaufforderung stillschweigend zu bestätigen, aber in der Praxis dauert ein großes Skript mit Hunderttausenden von xcopy-Befehlen ewig, und ich sehe keine Beschleunigung, wenn einige oder die meisten dieser Dateien bereits mit demselben Datum vorhanden sind. Haben Sie Ideen, die mir helfen könnten? Was kann ich mit einer Datei tun, die Hunderte von Quell- und Zielpfaden enthält, um eine Kopie von all diesen zu erstellen? Gibt es eine schnellere Alternative zu xcopy? Oder eine schnellere Datumsprüfung und dann den Aufruf eines beliebigen Kopierbefehls?
Eine ausführlichere Erklärung, wie ich derzeit Dateien basierend auf DB-Informationen erhalte und kopiere: Es gibt mehrere Tabellen in der DB:
Tabelle 1: ID, Dir_Name, ...
Tabelle 2: ID, Dir_Name, ...
...
Tabelle N: ID, Dir_Name, ...
Tabelle mit Quellordnerpfaden: Dir_Name, Dir_FullPath
Tabelle mit Zielordnerpfaden: Dir_Name, Dir_FullPath
Dann kann ich den Satz von Kopierbefehlen erstellen (oder einfach die Quell- und Zielpfade abrufen)
Select 'xcopy /d /y '|| T2.Dir_FullPath || '\\' || ID || '.ext ' || T3.Dir_FullPath || '\\' || ID || '.ext*'
from Table1 T1
left join SourceFolderPathsTable T2 on T1.Dir_Name=T2.Dir_Name
left join DestFolderPathsTable T3 T1.Dir_Name=T3.Dir_Name where T1.some_criteria=true;
Danke schön!
Antwort1
Sehen Sie sich das Befehlszeilentool „robocopy“ an, das mit Windows mitgeliefert wird. Ich glaube, es akzeptiert möglicherweise eine Antwortdatei, und es kann bereits angewiesen werden, nur Dateien zu aktualisieren, deren Datum/Uhrzeit geändert wurde. Außerdem ist es so schnell wie möglich, da es sich um eine reine Befehlszeile ohne GUI-Overhead handelt.