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

Ausgedruckt am: 29.03.2024 um 05:03 Uhr

Mitglied: Biber
Biber 31.07.2006 um 16:07:10 Uhr
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
Mitglied: Zufi
Zufi 01.08.2006 um 16:13:35 Uhr
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
Mitglied: Biber
Biber 01.08.2006 um 16:45:59 Uhr
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
Mitglied: Zufi
Zufi 01.08.2006 um 17:51:56 Uhr
Goto Top
Jetzt funktionert es, Genial. Vielen Dank für die tolle Unterstützung.

Gruss und schönen Abend
Zufi
Mitglied: Biber
Biber 01.08.2006 um 18:09:23 Uhr
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...