dabjoern
Goto Top

Robocopy mehrerer Dateien

Hallo Leute,

ich will eine unbestimmte Anzahl von Dateien gleicher Dateiendung (*.ods) mit Robocopy vom Desktop in einen Ordner kopieren. Beim Kopieren sollen die Dateien in %USERNAME%_Dateiname_%laufendeNummer%.xxx umbenannt werden. Wie kann ich am Besten die laufende Nummer erzeugen?

Grüße
dabjoern

Content-Key: 21102

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

Ausgedruckt am: 29.03.2024 um 01:03 Uhr

Mitglied: dabjoern
dabjoern 07.12.2005 um 20:24:15 Uhr
Goto Top
Hi Leute,

ich habe nun dieses Skript zusammengestellt.

@echo off
REM
REM In Datei alle .ods speichern mit /b - ohne Kopfdaten
dir "%USERPROFILE%\desktop\*.ods" /b 1>_dateiliste.tmp
REM In Variablen Dateinamen speichern
for /f "tokens=1,2,3,4,5,6,7,8,*" %%i in (_dateiliste.tmp) do set /a %%i %%j %%k %%l %%m %%n %%o %%p %%q
REM In Datei alle .ods Dateien (mit Anzahl) speichern
dir "%USERPROFILE%\desktop\*.ods" 1>_dateiliste2.tmp
REM In Datei die Anzahl der .ods Dateien speichern (mit Zusatzinformationen)
REM /c zeigt nur die Anzahl der die Zeichenfolge enthaltenden Zeilen an
find "ods" _dateiliste2.tmp /c >_dateianzahl.tmp
REM In Variable COUNT die Zahl der Variable c speichern
for /f "skip=1 tokens=1,2,3 delims=: " %%a in (_dateianzahl.tmp) do set /a COUNT=%%c

Also nun habe ich in der Datei _dateiliste.tmp alle Dateinamen und in der Variable COUNT die Anzahl der Dateien.

Aber jetzt weiß ich nicht, wie die Schleife lauten müsste, damit die x Dateien auf dem Desktop nach obigen Anforderungen umbenannt werden. Hat jemand einen Tipp? Danke im Voraus.

Grüße
dabjoern
Mitglied: dabjoern
dabjoern 07.12.2005 um 20:57:51 Uhr
Goto Top
Okay, ich habe gesehen, dass es auch einfacher geht:

@echo off
cls
REM
REM In Datei alle .ods speichern mit /b --> ohne Kopfdaten und aehnliches
dir "%USERPROFILE%\desktop\*.ods" /b 1>_dateiliste.tmp
for /f %%i in (_dateiliste.tmp) do (rename "%USERPROFILE%\Desktop\%%i" "%USERNAME%_%%i")


face-wink)

Jetzt habe ich nur noch das Problem, dass Dateinamen mit Leerzeichen nicht umbenannt werden.

Grüße
dabjoern
Mitglied: Biber
Biber 07.12.2005 um 21:19:10 Uhr
Goto Top
Moin dabjoern,

wenn Du schon so weit bist, lohnt sich der Einsatz von Robocopy ja kaum noch.
die paar restlichen Zeilen bekommst du dann mit einem normalen Copy hin.

Vorweg: Zwei Sachen begreife ich nicht (bzw. langsamer als andere):
a) ...ööhm, Dein COUNTer fängt dann immer wieder bei 1 an? Auch wenn Du jeden Tag sicherst? Da wird es aber schnell Dateinamenskollisionen geben.. Ich würde eher den bisherigen höchsten vergebenen COUNTer je %USERNAME% ermitteln und von da an weiterzählen... egal - dann musst du wenigstens festlegen, wie sich der Batch sinnvoll verhalten soll, wenn Datei "HeinzUser_035.ods" kopiert werden soll und schon im Zielverzeichnis existiert...

b) Was Du in der ersten FOR /F IN..DO..-Schleife machst ode glaubst zu tun) versteh ich nicht. Warteschleife?

Ich würde es sinngemäß so abfackeln (ist natürlich ungetestet):
@echo off & setlocal
...
...
Set "Counter=10000"
for /f %%i in ('dir /b "%USERPROFILE%\desktop\*.ods"') do call :copyLfd "%%i"
goto :eof

:copyLfd
set /a Counter+=1
Set "CounterLast4Chars=%counter:~-4%
Copy "%~dpnx1" "x:\y\Neuerordner\%Username%_%~n1_%CounterLast4Chars%.%~x1"
goto :eof
~~~~


Das wars.
Und, wie geschrieben, ich würde den Zähler nicht immer bei 1 anfangen lassen.
HTH Biber

[Edit] sorry, hatte nur langsamer getippt - ist noch keine Antwort auf Dein P.S., sondern parallel entstanden. Jetzt warte ich erstmal, welche Variante Du weiterführst... [/Edit]
Mitglied: dabjoern
dabjoern 07.12.2005 um 22:44:29 Uhr
Goto Top
Hallo auch,

also arbeite zum ersten Mal mit for-Schleifen. Insofern sei der obige "Quatsch" mal entschuldigt face-wink Also ich woll einfach die Dateien mit einer laufenden Nummer versehen und den Zähler nicht zurücksetzen. Des Weiteren würde ich schon gern mit Robocopy arbeiten aufgrund der Logfile-Erstellung.

Zwei Fragen:
1) Kann es sein, dass Robocopy beim Kopieren die Dateinamen nicht umbenennen kann? Also was in der Form:

dir "%USERPROFILE%\desktop\*.ods" /b 1>_dateiliste.tmp
for /f "usebackq" %%i in (_dateiliste.tmp) do (robocopy "%USERPROFILE%\Desktop" "d:\pruefung\dest" %%i "%USERNAME%_%%i" /A-:rsh /LOG+:d:\pruefung\log\%USERNAME%_start_log.log)

2) Wenn das Robocopy nicht kann, dann möchte ich die Dateien vorher per rename umbenennen. Ich habe das Gefühlt, dass es da noch einige Besonderheiten bezüglich Leerzeichen in Dateinamen gibt:

dir "%USERPROFILE%\desktop\*.ods" /b 1>_dateiliste.tmp
for /f %%i in (_dateiliste.tmp) do (rename "%USERPROFILE%\Desktop\%%i" "%USERNAME%_%%i")

--> Dieser Code packt es noch nicht, Dateien mit Leerzeichen umzubenennen. Dasmit dem usebackq hab ich noch nicht ganz verstanden.

Grüße
dabjoern
Mitglied: dabjoern
dabjoern 07.12.2005 um 23:51:16 Uhr
Goto Top
Also dieses Teil tut schonmal seine Aufgabe ganz gut. Dateien mit Leerzeichen werden bearbeitet:

for /f "delims=" %%i in ('dir "%USERPROFILE%\desktop\*.ods" /b') do (rename "%USERPROFILE%\Desktop\%%i" "%USERNAME%_%%i")

Jetzt ist nur noch kein Counter drinnen.

Grüße
dabjoern
Mitglied: dabjoern
dabjoern 08.12.2005 um 21:46:58 Uhr
Goto Top
Hi auch,

das Skript funktioniert nun super. Danke an den Biber face-smile)

@echo off & setlocal
set "counter=10000"
for /f %%i in ('dir /b "%USERPROFILE%\desktop\*.ods"') do call :copyLfd "%%i"
goto :eof
:copyLfd
set /a counter+=1
set "countersnip=%counter:~-4%
rename "%~dpnx1" "%USERNAME%_%~n1_%countersnip%%~x1"
goto :eof
:eof

Nur mal eine kurze Frage: Was bedeutet dieses eof immer? Auf der Seite http://www.antonis.de/dos/batchtut/bat-kurs/ hab ich das gelesen: EOF-Zeichen = Control-Z. Das sollte doch dann ein Abbrechen des Batchvorganges bedeuten, oder?

Und nochwas: habe ich die goto-Anweisungen nicht drinnen, will er das Ganze 3 mal durchlaufen (obwohl nur 2 ods Dateien auf dem Desktop liegen). Wieso das?

Grüße und vielen vielen Dank
dabjoern
Mitglied: Biber
Biber 09.12.2005 um 10:36:55 Uhr
Goto Top
Moin dabjoern,

a) die Anweisung "goto :eof" entspricht in etwa dem "RETURN" oder "END SUB" anderer Skriptsprachen. Ist eine interne Anweisung, d.h. es braucht keine Sprungmarke namens ":eof" definiert werden (Kannst auch Deine letzte Zeile wieder löschen, sonst verwirrst Du den CLI nur). Ich würde "goto :eof" also hier eher übersetzen mit "goto End-Of-Function" als mit "goto End-of-File".

b) das EOF-Zeichen ist Control-Z. Ja. Brauchte man/frau zu Edlin-Zeiten hin und wieder. Hat heute keine Bedeutung mehr. Abheften und bei Bedarf wieder vorholen.

c) >> ohne goto-Anweisungen rennt er dreimal um die Dörfer...
Jepp. Genau deshalb stehen ja die Goto-Anweisungen da. Der Batch ist ja eigentlich zu Ende nach der FOR...IN..DO-Anweisung. Da heißt "goto :Eof" wirklich "gehe zum Ende/RETURN".
Danach kommt noch ein "Unterblock"/eine "SubRoutine namens ":copyLfd". Deren Ende/deren "END SUB" wird im Batch wieder durch die Standard-Phrase "goto :eof" gekennzeichnet.

HTH und schönes Wochenende
Biber
Mitglied: dabjoern
dabjoern 09.12.2005 um 10:44:38 Uhr
Goto Top
Danke dir tausendmal. Gestern Nacht hatte ich noch ein Tutorial von dir gelesen (findlongpath Teil 1). Dort hattest du schon ein wenig eof erklärt. Aber hier gefällt es mir noch besser. Vielen Dank und auch dir ein schönes WE.

Grüße
dabjoern
Mitglied: dabjoern
dabjoern 12.12.2005 um 10:20:22 Uhr
Goto Top