sasasasa
Goto Top

Dateien in Unterverzeichnis kopieren mit Datum der letzten Änderung

Ich möchte Alle Dateien in einem Verzeichnis in ein Unterverzeichnis kopieren und dabei die Dateinamen so modifizieren, dass das Datum der letzten Änderung der jeweiligen Datei in einem bestimmten Format an den Dateinamen angehängt wird.

Ich weiß noch nicht so recht, wie ich das anstellen soll... Hier erstmal ein Beislpiel wie es aussehen soll:

Ordner: C:\Beispiel
Unterordner: c:\Beispiel\Unterordner

Dateien in C:\Beispiel:
bsp1.txt - zuletzt geändert am 01.01.2009
bsp2.txt - zuletzt geändert am 03.05.2009

Soll-Dateien in C:\Beispiel\Unterordner:
bsp1_20090101.txt
bsp2_20090503.txt

Folgendes war mein erster Ansatz um an das Datum zu kommen war:

set mycopypath=C:\Beispiel

for /f "delims=" %%i in ('dir %mycopypath% /s /b /a-d') do (  
	set file_date=%%~ti
	echo %file_date%
)

Allerdings erhalte ich dabei nur ein Datum und auch alle Dateien aus allen Unterverzeichnissen face-sad
Außerdem erhalte ich den gesamten Pfad, den ich dann noch auseinander nehmen müsste, um das Ziel für den copy-Befehl zu generieren. Desweiteren muss das Datum noch umformatiert werden. Stehe da etwas Ratlos vor. Normalerweise würde ich für sowas kurz eine Anwendung programmieren, damit wär ich in ein paar Minuten durch, aber leider kann man sich das ja nicht immer aussuchen...

Content-Key: 120421

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

Printed on: April 16, 2024 at 06:04 o'clock

Member: sasasasa
sasasasa Jul 14, 2009 at 13:25:04 (UTC)
Goto Top
Die Zerlegung des Datums und neue Zusammensetzung habe ich nun schon gelöst:

Set jahr=%file_date:~6,4%
set monat=%file_date:~3,2%
set tag=%file_date:~0,2%
Member: sasasasa
sasasasa Jul 14, 2009 at 15:23:40 (UTC)
Goto Top
Habe das Problem nun gelöst, in dem ich das Prozedere auf 2 Batch-Dateien aufgeteilt habe: Die For-Schleife und das kopieren:

Hier die Datei für die Schleife:

@echo off

set projectpath=C:\Beispiel\

for /f %%i in ('dir %projectpath% /b /a-d') do (  
	call c:\batch\copywithmodifieddate.bat %projectpath%%%i %projectpath%Unterordner
)

copywithmodifieddate.bat

@echo off

if {%1}=={} (
	goto :error
)

if {%2}=={} (
	goto :error
)

set file_date=%~t1
Set jahr=%file_date:~6,4%
set monat=%file_date:~3,2%
set tag=%file_date:~0,2%
set stunde=%file_date:~11,2%
set minute=%file_date:~14,2%

set ModifiedDate=%jahr%%monat%%tag%_%stunde%%minute%
set FileName=%~nx1
set FileEnding=%FileName:~-4%
set NewFileName=%FileName:~0,-4%
set NewFileName=%NewFileName%_%ModifiedDate%%FileEnding%
set NewFileName=%2\%NewFileName%

copy %1 %NewFileName% /Y

goto :end



:error
echo "Usage of copywithmodifieddate:"  
echo "copywithmodifieddate <SourceFile> <DestinationFolder>"  


:end
Member: Biber
Biber Jul 14, 2009 at 15:58:37 (UTC)
Goto Top
Moin sasasasa,

willkommen im Forum.
und danke fürs Bereitstellen Deiner vorbildlich strukturierten Lösung.

Lass mich raten - Du bringst als Programmier-Hintergrund offensichtlich VB-Kenntnisse mit? *g

Zum rein Handwerklichen noch ein, zwei Tipps:
  • Du musst nicht zwei Batchfiles verwenden, sondern kannst auch einen "call" auf einen benannten Codeblock in der gleichen Batchdatei absetzen. Also das, was Du bisher mit "call externeAusführbareDatei Parameter1 Parameter2" tust geht (fast) genauso mit "call: internerBenannterBlock parameter1 Parameter2".
  • Vorteil davon: wenn es ein "interner" Block ist, dann kannst Du Dir die ganzen Parameterprüfungen schenken - Du bist der Einzige, der es aufruft und Du weißt wie
  • das "goto :end " mit einer handgeschriebenen Sprungmarke ":end" kannst Du ersetzen durch ein "goto :eof" mit "virtuell geschriebener" Sprungmarke ":eof"
  • und damit alle Variablen, die Dein Schnipsel so braucht, auch "privat" bleiben verwende in Zukunft den Befehl "SetLocal"

[Alle erwähnten neuen Vokabeln hat M$ relativ gut dokumentiert ... ein "Setlocal /?" oder "call /?" oder "goto /?" vom CMD-Prompt aus schafft schnell Klarheit.]

Grüße
Biber