Dateien aus Verzeichnis X nach Verzeichnis Y mit cmd
romy
- programmiertechnik
Hallöchen,
so ich habe mal eine private Frage. Ich würde gern Dateien von X nach Y kopieren mit einem kleinen Batchprogramm auf einem Windowsrechner. Dabei sollen die Dateien in Y aber nicht überschrieben werden, sondern wenn es eine gleiche Datei schon gibt, soll die zu kopierende umbenannt werden (meinetwegen eine laufende Nummer dran oder so).
Ich habe mich gerade dämlich gesucht, aber ich verstehe einfach die Syntax nicht.
xcopy kopiert ja problemlos: xcopy c:\Test\A\*.* c:\Test\B\ /Q /C /Y
Aber entweder fragt xcopy oder überschreibt eben. Naja, also ne for-Schleife um die Verzeichnisse auszulesen. Ich kann die Syntax echt nicht nachvollziehen, mir fehlen so viele Hinweise. Kann mich bitte jemand aufhellen?
Das wäre nett, danke.
ciao
romy
Yerf!
Aber entweder fragt xcopy oder überschreibt eben. Naja, also ne for-Schleife um die Verzeichnisse auszulesen. Ich kann die Syntax echt nicht nachvollziehen, mir fehlen so viele Hinweise. Kann mich bitte jemand aufhellen?
Die cmd kennt zwar eine for-Schleife, die Syntax ist aber total komisch...
Ich würde sowas per JScript lösen, da kann man wenigstens "normal" programmieren ;-)
Gruß,
Harlequin
Hi Harlequin,
Ich würde sowas per JScript lösen, da kann man wenigstens "normal" programmieren ;-)
Auch diese Sprache ist mir nicht wirklich eingängig, aber danke für den Tipp.
ciao
romy
Hallo romy,
nur eine Idee:
in einer Schleife läufst du durch alle Dateien und rufst für jede Datei eine Kopierbatch auf, die prüft und bei Bedarf renamed. Dieses Prüfen muss natürlich in einer Schleife passieren, um zu testen ob schon weitere Versionen der Datei existieren.
Befehle, die du benötigst, sind u.a.
xcopy
for
if
goto
Mit help erhältst du eine Liste aller Batchbefehle, mit z.B. help if erhältst du Infos zum if-Befehl.
Gruß, Jürgen
Hi JürgenB,
in einer Schleife läufst du durch alle Dateien und rufst für jede Datei eine Kopierbatch auf, die prüft und bei Bedarf renamed. Dieses Prüfen muss natürlich in einer Schleife passieren, um zu testen ob schon weitere Versionen der Datei existieren.
klingt gut.
Befehle, die du benötigst, sind u.a.
xcopy
for
if
goto
Mit help erhältst du eine Liste aller Batchbefehle, mit z.B. help if erhältst du Infos zum if-Befehl.
Ich weiß, aber ich kann mit der Erklärung zu "help for" nichts anfangen.
Mal ein Beispiel:
C:>help for
Führt einen Befehl für jede einzelne Datei für einen Satz von Dateien aus.
FOR %Variable IN (Satz) DO Befehl [Parameter]
%Variable Ein ersetzbarer Parameter bestehend aus einem einzelnen
Buchstaben.
>>> Was soll das heißen? Was ist ein ersetzbarer Parameter? Muss der dahin?
(Satz) Ein Satz von mindestens einer Datei. Platzhalter sind zulässig.
>>> Was ist mit Satz gemeint?
Befehl Befehl, der für jede Datei ausgeführt werden soll.
Parameter Parameter und Optionen für den angegebenen Befehl.
Verstehst du, ich begreife die Hilfe nicht. Ich kann PHP-Code schreiben, ich verstehe C-Code und ein bisschen Delphi, selbst Java könnte ich lesen. Ich kann einfach keinen Bezug herstellen zu dieser Art von Code.
Pseudocodemäßig würde ich sagen:
Schleife über alle Dateien des angebenen Verzeichnisses
wenn Datei in Zielvorzeichnis vorhanden, dann rename, dann copy
wenn Datei nicht vorhanden, dann copy
rename am Besten mit Timestamp, dann muss ich nicht umständlich nach schon umbenannten laufenden Nummern suchen.
So, jetzt fange ich an mit der Batch-Datei:
REM Ich gehe davon aus, dass %%i die Datei ist, %% habe ich schon irgendwo gelesen
FOR %%i IN (A:) DO
SET datum=TIME(now,yyyymmtt)
IF EXIST B:%%i (REN %%i %%i%datum%)
XCOPY %%i B:\ /Q /C /Y
Dabei passiert allerdings nichts. Ich bekomme auch keinen Fehler.
Kannst du mir weiterhelfen?
ciao
romy
Hi ICH,
FOR %%i IN (A:) DO
SET datum=TIME(now,yyyymmtt)
IF EXIST B:%%i (REN %%i %%i%datum%)
XCOPY %%i B:\ /Q /C /Y
Wenn ich Klammern setze kommt zumindest ein Fehler:
FOR %%i IN (A:) DO (
SET datum=TIME(now,yyyymmtt)
IF EXIST B:%%i (REN %%i %%i%datum%)
XCOPY A:%%i B:\ /Q /C /Y
)
nämlich %i nicht gefunden???
ciao
romy
Yerf!
Wenn ich Klammern setze kommt zumindest ein Fehler:
FOR %%i IN (A:) DO (
SET datum=TIME(now,yyyymmtt)
IF EXIST B:%%i (REN %%i %%i%datum%)
XCOPY A:%%i B:\ /Q /C /Y
)nämlich %i nicht gefunden???
Die Klammern sind wichtig, damit alle Befehle innerhald der For-Schleife ausgeführt werden (ansonsten nur der Befehl direkt hinter DO in der selben Zeile). Allerding erwartet FOR eine Datei, die dann Zeilenweise verarbeitet wird. Folgende Anweisung sollte da weiterhelfen:
for /f "usebackq" %%i in (dir a: /b
) do (echo %%i)
Dabei wird die Ausgabe des Dir-Befehls für die FOR-Schleife verwendet.
Gruß,
Harlequin
PS: Ganz ehrlich: ich finde da JScript wesentlich einfacher, vor allem wenn man schon mal mit JavaScript zu tun hatte.
Hallo romy,
so richtig Fit in Sachen DOS bin ich auch nicht mehr, aber so weit ich weiß kann for nur einen Befehl. "Begin" und "End" gibt es nicht. Daher der Vorschlag, mit for eine zweite Batch aufzurufen, die das Kopieren etc. übernimmt. Das hat auch den Vorteil, dass die Kopierbatch an einzelnen Dateien getestet werden kann.
Versuch mal
for %d in (*.*) do echo %d
um for zu verstehen. Statt echo %d kommt dann mycopy %d, und mycopy prüft, renamed bei Bedarf und kopiert. Übergabeparameter kommen dann als %1, %2, ... in der Batch an.
Gruß, Jürgen