schplint
Goto Top

Batch - Dateien kopieren und ggf. umbenennen

[Edit Biber:] Originaltitel "[Batch] Dateien kopieren und ggf. umbenennen" beim Verschieben geändert.
Die eckigen Klammern sind nicht mehr speicherbar im Titel.
[Edit]

Hallo allerseits,
habe mittlerweile versucht seit einigen stunden eine Antwort für mein Problem im Forum zu finden, jedoch komme ich einfach nicht weiter.

Mittels einer Batch Datei möchte ich ein Backup von einem Laufwerk machen. Diese Dateien sollen auf ein anderes Laufwerk kopiert werden.
Vor dem kopieren soll geprüft werden, ob bereits Ordner oder Dateien mit gleichen Namen bereits auf dem Backup Laufwerk vorhanden ist. Sollte dies der Fall sein, soll an den Dateien bzw Ordnern das aktuelle Datum angehängt werden.

Mein Ansatz sieht wie folgt aus;
@echo off

Set parentdir=X:\

Set targetdir=F:\

xcopy "%parentdir%" %targetdir% /e /q /h /y

Weiter bin ich bissher nicht gekommen, hoffe ihr könnt mir weiterhelfen, habe wie gesagt mit den anderen Beiträgen aus dem Forum bezüglich dieses Themas nix anfangen können.

Content-ID: 43669

Url: https://administrator.de/contentid/43669

Ausgedruckt am: 18.11.2024 um 03:11 Uhr

bastla
bastla 04.11.2006, aktualisiert am 18.10.2012 um 17:57:24 Uhr
Goto Top
Hallo schplint!

Vielleicht kannst Du konkreter beschreiben, was Du vor hast, insbesondere wie viele verschiedene Dateiversionen Du aufheben willst. Nach Deiner obigen Aussage würden nämlich (durch das Umbenennen) überhaupt niemals alte Sicherungsstände überschrieben, wodurch Du vermutlich mit der Zeit Platzprobleme bekämst.

Nicht sinnvoll ist es, sowohl Ordner- als auch Dateinamen für in der Sicherung bereits vorhandene Elemente zu verändern - eines von beidem genügt. Zur Demonstration zwei Varianten:
Wenn Du kein Problem damit hast, Ordner unter anderem Namen zu speichern, könntest Du gleich die ganze Sicherung in jeweils einen neuen Ordner legen und dort (um Platz zu sparen) nur die veränderten Dateien (Schalter /m) hinkopieren, also etwa so:

xcopy /e /h /m /q /y X:\*.* F:\2006-11-04\*.*
Um das Tagesdatum als Ordnernamen zu verwenden, kannst Du Dich an der unten beschriebenen Lösung (hier geklaut bei Biber) mit VBScript und der Variablen "Datum" orientieren.
Wenn es kein Problem ist, dass sich Dateinamen ändern, könnstest Du die ursprüngliche Ordnerstruktur beibehalten und generell die Sicherungsdateien mit angefügtem Datum speichern. Das ginge so:

Zunächst ist der folgende Code als "GetDate.vbs" zu speichern (in meinem Beispiel im Ordner "Z:\Scripts"), um das aktuelle Datum im Format "JJJJ-MM-TT" zu erzeugen:
WScript.Echo Year(Date) & "-" & Right("0" & Month(Date),2) & "-" & Right("0" & Day(Date), 2)  

Die für die Sicherung zuständige Batchdatei sieht wie folgt aus:
@echo off & setlocal
for /f %%d in ('cscript //nologo Z:\Scripts\GetDate.vbs') do set Datum=%%d  
xcopy /t "X:\*.*" "F:\*.*"  
pushd X:\ 
for /r %%i in (*.*) do copy "%%i" "F:\%%~pi%%~ni-%Datum%%%~xi"  
popd

Hier wird im ersten Schritt die Ordnerstruktur kopiert und im zweiten Schritt jede einzelne Datei unter einem um das Datum erweiterten Namen in den entsprechenden Ordner übertragen. Bei Bedarf lassen sich Quelle (Xface-smile und Ziel (Fface-smile natürlich variabel gestalten.
Einschränkung: Es werden keine versteckten oder Systemdateien kopiert.

Bei Verwendung dieser Alternative würde in jedem Ordner des Backups die aktuelle Version aller Dateien zu allen bereits vorhandenen hinzugefügt, sodass Du als nächstes nach einer Löschstrategie suchen müsstest ...
Solltest Du wirklich viele verschiedene Versionen benötigen, empfiehlt sich aber ohnehin eher etwas in der Art: Version Backup. Vielleicht findet sich auch hier etwas Brauchbares ...

HTH
bastla

Da der Link zu dem alten, aber wie ich finde, guten "TaskZip" tot zu sein scheint: http://download.pchome.de/download/taskzip-v2.10.0002_484.html
Biber
Biber 04.11.2006 um 19:26:44 Uhr
Goto Top
Moin schplint,

ebenso wie bastla würde ich erst mal, vor der handwerklichen Umsetzung, die Strategie überdenken.
Den jeweils schon vorhandenen Dateien jeweils das Datum des Kopierens anzuhängen, ist auch IMHO keine so bestechende Idee.
Dann hast Du ja definitiv hinterher in Quell- und Zielverzeichnis unterschiedliche Dateinamen - wenn Du tatsächlich mal rücksichern musst, ist es alles Grütze schwierig.
Die zuletzt bearbeiteten Dateinamen in Deinen Applikationen (Word, Excel.. alles was einen "Verlauf" benutzt) passen alle nicht.

However, um Deine Frage dennoch zu beantworten:
Mach 3 xcopy's.
Zuerst stelle mit einem Xcopy fest, welche Dateien schon im Zielverzeichnis vorhanden sind.
Dafür jibbet den Parameter /U.
...
XCopy [deineXCopyParameter] /U /L quelle ziel\ >%temp%\JibbetSchon.Lst
XCopy [deineXCopyParameter] /Exclude:%temp%\JibbetSchon.Lst quelle ziel\ 
Xcopy [deineXCopyParameter] /U quelle ziel\%datumsprefix%_*.* 

[Das Beiwerk mit Zusammenbasteln von %datumsprefix% hab ich mal übersprungen; gibts hier mehrfach im Bereich Batch und Shell.]

Gruß
Biber
bastla
bastla 04.11.2006 um 19:46:36 Uhr
Goto Top
@Biber

Den jeweils schon vorhandenen Dateien jeweils das Datum des Kopierens anzuhängen, ist auch IMHO keine so bestechende Idee.
Hoffentlich hat's zur Abschreckung gereicht face-wink, weil für Versionierung gibt's auf jeden Fall Besseres ...
Übrigens: "%datumsprefix%_*.*" als Ziel funktioniert bei mir nicht.

Und weil Du grad in der Gegend bist: Gibt es eigentlich für XCOPY etwas in der Art von /-i (also: Ziel ist Datei und nicht Verzeichnis)?

Grüße
bastla
Biber
Biber 05.11.2006 um 18:26:16 Uhr
Goto Top
@bastla

Moin bastla,

Übrigens: "%datumsprefix%_*.*" als Ziel funktioniert bei mir nicht.

Jau, stimmt... habe es auch grad ausprobiert...macht der XCopy nicht...*axelzuck*

Dann eben mit einer Zeile "FOR /F... ...copy.... " statt der dritten XCopy-Zeile...
In dieser Exclude-List stehen doch schon alle Quell-Dateien, die es im Zielverzeichnis schon gibt.
Also machen wir das Kopieren dieser Dateien inclusive Umbenennen mit normalem Copy.
...
for /f "delims=. tokens=1-3" %%a in ("%date%") do set "dateprefix=%%c-%%b-%%a"  

XCopy [deineXCopyParameter] /U /L %quelle% %ziel%\ >%temp%\JibbetSchon.Lst
XCopy [deineXCopyParameter] /Exclude:%temp%\JibbetSchon.Lst %quelle% %ziel%\ 
for /f "delims=" %%i in (%temp%\JibbetSchon.Lst) do (  
    copy "%%i"  "%ziel%\%%~ni_%dateprefix%%%~xi"  
)
...

Zur zweiten Frage... hab ich auch noch nicht probiert.
Werde ich mal in einer ruhigen Minute.

Grüße
Biber
bastla
bastla 05.11.2006 um 18:48:40 Uhr
Goto Top
@Biber

Bekommst Du mit dem einfachen "copy" nicht Probleme mit dem Ziel-Pfad (gefragt war ja ua "xcopy /e" und damit wohl auch /s)?

Grüße
bastla
Biber
Biber 06.11.2006 um 07:57:51 Uhr
Goto Top
@bastla

Bekommst Du mit dem einfachen "copy" nicht Probleme ...
Stimmt schon, obwohl... "Problem" würde ich es noch nicht nennen...*gg

Dann muss/müsste eben noch eine "FOR /R quellroot....DO "-Anweisung außen drumherum und je Unterverzeichnis ein XCopy OHNE /s /e abgefeuert werden...

Ich denke aber, das eigentliche Problem ist mein Unterbewusstsein, das sich offensichtlich hartnäckig dagegen sträubt, sich mit schplints Plan ernsthaft anzufreunden.

Handwerklich lösbar ist es sicher, aber es ist nicht so charmant...

Grüße
Biber
bastla
bastla 06.11.2006 um 08:22:00 Uhr
Goto Top
@Biber

Ich denke aber, das eigentliche Problem ist mein Unterbewusstsein, das sich offensichtlich hartnäckig dagegen sträubt, sich mit schplints Plan ernsthaft anzufreunden.

ACK, wobei ein (fertiger) Plan ja noch gar nicht wirklich vorliegt.

(Ich hab's oben auch nur zu Übungszwecken versucht - was Du ja nicht brauchst face-smile)

Grüße
bastla
44227
44227 17.07.2007 um 21:38:16 Uhr
Goto Top
Hallo zusammen,

ich würd egerne was ähnliches, nur noch viel einfacheres machen.

Ich hätte gerne eine Batch, die mir die datei "Z:\proggies\Dokument.doc" in "f:\Backup" kopiert und dabei den Dateinamen mit dem aktuellen Datum ergänzt im sinne 070707_Dokuemtn.doc.

Ist so was einfach möglich?

Danke und Gruß,
Nermin
Biber
Biber 17.07.2007 um 21:55:54 Uhr
Goto Top
Moin Hajvazovic,

Dich hab ich ja lange nicht gelesen hier, welcome bäck.

Mach bitte für Deine Frage einen neuen Beitrag auf, falls Du über Forumssuche nach "batch umbenennen Zeit Datum" nichts Passendes findest.

Denn dieser Beitrag ist schon so verkorkst, dass ich den auch jetzt sofort schließe...
schplint hat sich sicherlich schon anderen wichtigen Fragen zugewandt.

Grüße
Biber

Ach ja, und ich verschiebe gleich mal den Beitrag von "Windows" nach "Batch & Shell".
Obwohl ich eigentlich gar nicht dort haben will...