jufe87
Goto Top

Batch, Dateien nach Endung suchen, kopieren und ggf umbenennen

Hallo!
Ich sitze schon eine ganze weile an dieser Batch-Datei, bekomme allerdings kein vernünftiges Ergebnis.

C:\ (mit Unterordnern) Soll nach *.blabla Dateien durchsucht werden und alle gefundenen sollen nach D:\ kopiert werden.
Dabei kann es auch sein, dass Dateinamen doppelt vorkommen, diese sollen dann ggf. geändert werden, sodass keine Datei überschrieben wird.
Ich habe mir das so überlegt, dass ich Die Uhrzeit mit milisekunden anhänge, damit es zu immer Unterschiedlichen namen kommt.
Dies klappt allerdings nicht, da pro Batch-Aufruf Immer die Selbe Zahl genommen wird.

Hier mein bisheriger code:

[code]
@echo off
REM Variablen Setzen
set dir=c:\
REM !!BITTE ENTSPRECHEND ANPASSEN!!
set file=*.blabla
set endung=.blabla
set pfad=D:
REM Erstellung der Zeitvariable
set h=%time:~0,2%
set m=%time:~3,2%
set s=%time:~6,2%
set ms=%time:~9,2%
set zeit=%date%_%h%h%m%m%s%s%ms%ms
REM Sucht nach Dateien und kopiert diese in einen Unterordner im oben angegebenen
REM Verzeichnis. Der Name des Unterordner Setzt sich aus
REM "Dateiname_Dateiendung_Datum_Uhrzeit mit milisekunde" zusammen.
for /r "%dir%" %%i in ("%file%") do (
if exist %%i xcopy "%%i" "%pfad%\%%~ni%endung%_%zeit%\" /V /S /I)
pause
[/code]

Jemand eine Idee?

Content-Key: 114117

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

Printed on: April 23, 2024 at 14:04 o'clock

Mitglied: 77559
77559 Apr 17, 2009 at 13:19:19 (UTC)
Goto Top
Klar, du setzt die Zeit statisch ausserhalb der Schleife einmal in die Variable.
Wie soll sich denn der Inhalt innerhalb der Schleife ändern?
Das ist doch kein Funktion die es in Batch eh nicht gibt.

Deine If Abfrage ist übrigends Lötzinn, deine Quell-Datei existiert immer.
Du kannst einen Teil in eine Subroutine verlagern, etwas so:

code übrigends mit spitzen Klammern.
@echo off&setlocal EnableDelayedExpansion
set dir=c:\
set file=*.blabla
set endung=.blabla
set pfad=D:
REM Sucht nach Dateien und kopiert diese in einen Unterordner im oben angegebenen
REM Verzeichnis. Der Name des Unterordner Setzt sich aus
REM "Dateiname_Dateiendung_Datum_Uhrzeit mit milisekunde" zusammen.  
for /r "%dir%" %%i in ("%file%") do Call :Sub "%%~fi" "%%~ni"  
pause
goto :EOF
:Sub
REM Erstellung der Zeitvariable
set zeit=%date%_%time::=%
set Ziel=%pfad%\%~2%endung%
if exist "%Ziel%" set Ziel=%Ziel%_%Zeit%  
echo xcopy %1 "%Ziel%" /V /S /I  

Ungestestet, wenn die Ausgabe richtig erscheint, das echo vor dem xcopy Befehl entfernen.

HTH

Gruß
LotPings
Member: hajowe
hajowe Apr 17, 2009 at 13:30:01 (UTC)
Goto Top
ja das ist was dran Zeit ausserhalb der Schleife verändert sich natürlich nicht.
Member: Biber
Biber Apr 17, 2009 at 13:48:22 (UTC)
Goto Top
<OT>
Zitat von @hajowe:

ja das ist was dran Zeit ausserhalb der Schleife verändert sich natürlich nicht.
Allerdings sind die Änderungen ausschließlich innerhalb einer Zeitschleife genauso unbefriedigend.
Siehe Und täglich grüßt das Murmeltier.

Schönes Wochenende
Biber
</OT>
Member: jufe87
jufe87 Apr 17, 2009 at 14:02:24 (UTC)
Goto Top
Das ist es leider nur fast.
So werden Dateien zum Teil doppelt kopiert, was ich allerdings nicht so recht verstehe.
Mitglied: 77559
77559 Apr 17, 2009 at 15:01:23 (UTC)
Goto Top
Zitat von @jufe87:
Das ist es leider nur fast.
So werden Dateien zum Teil doppelt kopiert, was ich allerdings nicht
so recht verstehe.

Naja, er kopiert ja erst wenn der echo Befehl raus ist, das eine Datei schon da ist kann also (noch) nicht passieren. Habs jetzt getestet und noch angepasst, durch die Zielnamensänderung kommt sonst jedesmal die Frage ob Ziel eine Datei oder ein Verzeichnis ist.

@echo off&setlocal
set dir=C:\
set file=*.blabla
set endung=.blabla
set pfad=D:\
for /r "%dir%" %%i in ("%file%") do Call :Sub "%%~fi" "%%~ni"  
Pause
goto :EOF
:Sub
set zeit=%date:.=%_%time::=%
set Ziel=%pfad%\%~2
if exist "%Ziel%%endung%" set Ziel=%Ziel%_%Zeit:,=-%  
Type NUL>"%Ziel%%endung%"  
xcopy %1 "%Ziel%%endung%" /F /Y /C /H /V  

Gruß
LotPings
Member: Biber
Biber Apr 17, 2009 at 15:03:12 (UTC)
Goto Top
Zitat von @jufe87:
Das ist es leider nur fast.
So werden Dateien zum Teil doppelt kopiert, was ich allerdings nicht so recht verstehe.
Moin jufe87,

willkommen im Forum.
Dieser Effekt wird durch den XCopy-Schalter "/s" wie in "works as designed" bewirkt.
Bei jedem
xcopy %1 "%Ziel%" /V /S /I
... wird ja die gefundene Datei %1 und alle gleichnamigen Quell-Dateien in Unterverzeichnissen darunter kopiert.
Aber die Dateien in Unterverzeichnissen triffst Du ja ohnehin später wieder im weiteren Verlauf der FOR /R-Rekursiv-Tour und kopierst sie nochmals.

Grüße
Biber
Member: bastla
bastla Apr 17, 2009 at 15:36:48 (UTC)
Goto Top
@77559
durch die Zielnamensänderung kommt sonst jedesmal die Frage ob Ziel eine Datei oder ein Verzeichnis ist.
Dem kannst Du vorbeugen, indem Du am Ende des Zieles noch einen Stern anfügst:
xcopy %1 "%Ziel%%endung%*" /F /Y /C /H /V
Grüße
bastla
Mitglied: 77559
77559 Apr 17, 2009 at 15:54:51 (UTC)
Goto Top
Zitat von @bastla:
Dem kannst Du vorbeugen, indem Du am Ende des Zieles noch einen Stern anfügst:

Danke bastla,
den kannte ich nicht (mehr, Alzheimer lässt grüßen face-wink

@Biber
das passiert wenn kann Codeteile ungeprüft übernimmt,
aber meine Änderung erschlägt auch das, den /S hatte ich rausgenommen.

Gruß
LotPings
Member: jufe87
jufe87 Apr 20, 2009 at 06:13:02 (UTC)
Goto Top
Also nach kurzem Test scheints super zu funktionieren.

Besten Dank!