zufi
Goto Top

Dateien mit Erstelldatum und Zeit renamen

Hallo zusammen

Ich habe folgendes Problem; ich habe bereits einen Batch der soweit auch einwandfrei funktioniert. Jetzt möchte ich diesen Batch jedoch mit Sekunden erweitern. Ich benötige die Sekunden weil ich teilweise Dateien mit dem Erstell Datum in der gleichen Minute umbenennen will.


Code Schnippsel
@echo off
for /F "Tokens=1-5,*" %%f in ('dir /a-D /Tc /-C ^|find "."') do call :loop %%f %%g %%h %%i
goto Ende
:loop
set DirDatetime=%1%2
set MyDateTime=%DirDateTime:~6,4%%DirDateTime:~3,2%%DirDateTime:~0,2%-%DirDateTime:~10,2%%DirDateTime:~13,2%%DirDateTime:~16,2%
rename %~f4 %MyDateTime%%~x4
:Ende

Datei mit aktuellem Code: yyyymmdd-hhmm_filenname.txt
Gewünschtes Ergebnis: yyyymmdd-hhmmss_filenname.txt

Besten Dank für eure Unterstützung.

Gruss
Zufi

Content-Key: 37026

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

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

Member: Biber
Biber Jul 31, 2006 at 14:07:10 (UTC)
Goto Top
Moin Zufi,

das geht nicht mit dem normalen DIR-Befehl... oder genauer gesagt, M$ zeigt dir zwar in allen möglichen GUIs angefangen vom Explorer die Sekunden der Datei-Datumswerte an.
Nicht aber unter dem CMD.
Auch nicht mit Reg-Hacks und Tweaks.

Einzige Chance (allerdings ziemlich aufwändig): die Datei-Sekunden über JS/VBS ermitteln.
Und ggf. im Batch weiterverarbeiten.

Wenn Dich der Aufwand nicht schreckt, zwei kurze Skizzen.

a) Kleine *-vbs-Datei erstellen, die das Datum einer existierenden Datei zurückgibt.
'-----snipp FileDate.vbs  
Set fso = CreateObject ("Scripting.FileSystemObject")   
Set f = fso.getfile(wscript.arguments(0)) 
    WScript.echo f.datecreated & " " & f.name   
'--------snapp FileDate.vbs  
Ein Aufruf am CMD-Prompt liefert z.B.:
>cscript //nologo f:\filedate.vbs d:\temp\sqlcmd.exe
08.03.2006 10:52:41 sqlcmd.exe
...also irgendwas mit den Datei-Sekunden...und die kann ich da rauspuzzlen genauso wie aus der DIR-Ausgabe.

b) Dasselbe mit temporär erzeugter VBS-Datei aus einem Batch heraus:
:: ----snipp-- getFileDateViaBatch.bat
@echo off & Setlocal
set "vbstemp=%temp%\getfiledate.vbs"  
echo Set fso = CreateObject ("Scripting.FileSystemObject") >%vbstemp%  
echo Set f = fso.getfile(wscript.arguments(0)) >>%vbstemp%
echo WScript.echo f.datecreated >>%vbstemp%
cscript //nologo %vbstemp% d:\temp\sqlcmd.exe
del %vbstemp%
:: ----snapp-- getFileDateViaBatch.bat
Output am CMD-Prompt (zum weiterverbeiten mit FOR /F...
>f:doGetFdate.bat
08.03.2006 10:52:41
So wäre ungefähr die Skizze...

und den Dateinamen dann eben basteln wie Du es oben auch schon machst:
for /f "tokens=1-6 delims=.:" %%a in ("08.03.2006 10:52:41") do ....
...wobei dann Token 1 wieder der Tag, Token 2 der Monat.....Token 6 die Sekunden wären.
und natürlich in der FOR-/F -Klammer nicht "08.03.2006 10:52:41" im Klartext steht, sondern etwas wie
FOR /F.....%%a in ('cscript //nologo  %vbstemp% datei.xyz') DO...  
Hope that Helps.

Biber
Member: Zufi
Zufi Aug 01, 2006 at 14:13:35 (UTC)
Goto Top
Hallo Biber

Besten Dank für deine Hilfe. Jetzt werden die Sekunden angezeigt. Wenn ich das Resultat mit echo teste wird die korrekte Datumsanzeige ausgegeben. Wenn ich jedoch die Datei umbennen will erhalte ich einen Syntaxfehler.

Das aktuelle Skirpt ohne seperates VBS.
@echo off
for /F "Tokens=1-6" %%f in ('cscript //nologo V:\FileDate.vbs V:\TestDatei.txt') do call :loop %%f %%g %%h %%i
goto Ende
:loop
set DirDatetime=%1%2
set myDateTime=%DirDateTime:~6,4%%DirDateTime:~3,2%%DirDateTime:~0,2%-%DirDateTime:~10,2%%DirDateTime:~13,2%%DirDateTime:~16,2%
rename %~f4 %MyDateTime%%~x4
:Ende

Danke und Gruss
Zufi
Member: Biber
Biber Aug 01, 2006 at 14:45:59 (UTC)
Goto Top
Moin zufi,
in der FOR /F -Anweisung hast Du die Klausel "delims=:." vergessen.

Deshalb würde ja z.B. herauskommen...
(=16:33:57  D:\temp=)
>for /f "tokens=1-6" %f in ("22.03.2006 11:33:55") do @echo %f %g %h %i %j %k  
22.03.2006 11:33:55
...also nur zwei Parameter als %1 ("22.03.2006") und %2 ("11:33:55") unten in der :loop ankommen.
Da hast Du aber Parameter 3 und 4, die Du voraussetzt.

Richtiger wäre also
(=16:40:23  D:\temp=)
>for /f "tokens=1-6 delims=.: " %f in ("22.03.2006 11:33:55") do @echo %h-%g-%f_%i%j%k  
2006-03-22_113355
- oder, in Deinem Batch:
::----DateTimeRenamer.bat
@Echo off
for /F "Tokens=1-6 delims=:. " %%f in ('cscript //nologo V:\FileDate.vbs V:\TestDatei.txt') do call :loop %%h-%%g-%%f_%%i%%j%%k V:\TestDatei.txt  
goto :eof
:loop [2 Parameter: Par1=Dateitimestring formatiert; Par2= FQ-Dateiname]
rename %~f2 %1%~x2
::---- snapp DateTimeRenamer.bat

[weitgehend ungetestete Skizze]

Gruß
Biber
Member: Zufi
Zufi Aug 01, 2006 at 15:51:56 (UTC)
Goto Top
Jetzt funktionert es, Genial. Vielen Dank für die tolle Unterstützung.

Gruss und schönen Abend
Zufi
Member: Biber
Biber Aug 01, 2006 at 16:09:23 (UTC)
Goto Top
wenn man/frau zu lange auf die gleiche Stelle guckt, geht der Überblick verloren.

Der CALL-Block ist ja inzwischen überflüssig; das ganze so genannte Batchprogramm ist nur noch ein Oneliner:
::----DateTimeRenamer.bat
@for /F "Tokens=1-6 delims=:. " %%f in ('cscript //nologo V:\FileDate.vbs V:\TestDatei.txt') do rename V:\Filedate.txt %%h-%%g-%%f_%%i%%j%%k.txt   
::---- snapp DateTimeRenamer.bat
-oder, wenn der Dateiname pfiffigerweise als Parameter übergeben wird (Aufruf also "DatetimeRenamerWithPar.bat V:\TestDatei.txt"):
::----DateTimeRenamerWithPar.bat
@for /F "Tokens=1-6 delims=:. " %%f in ('cscript //nologo V:\FileDate.vbs %1') do rename %~f1 %%h-%%g-%%f_%%i%%j%%k%~x1   
::---- snapp DateTimeRenamerWithPar.bat

Egal, gelöst haben wir es jetzt und etwas kürzer und eleganter kann es später immer noch werden...