hasenfuss
Goto Top

Erstellungsdatum auslesen und als neuen Dateinamen verwenden

Hallo,

ich habe folgendes Problem:

Ich möchte aus einem Ordner Dateien umbennen. Der neue Name soll das Erstellungsdatum und die Uhrzeit sein. Ich habe mir schon eine Batchdatei gebastelt und kann auch dieses Datum auslesen:

for %%f in ("verzeichniss") do echo %%f: %%~tf

Leider bekomme ich das Datum in tt:mm:jjjj Form zurück. Die Forum jjjj:mm:tt hh:ss wäre aber 1000 mal besser, sonst werden die Dateien wild durcheinander geworfen.
Außerdem hab ich noch das Problem dass z. B. bei:

for %%f in ("dir") do rename %%f %%~tf.doc

nur einen Syntaxfehler angezeigt bekomme, weil das Datum und die Uhrzeit mit einem Leerzeichen getrennt sind.

Ich bin jeder Anregung dankbar. Vielen Dank im Voraus.

Hasenfuss

Content-Key: 15202

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

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

Member: Biber
Biber Aug 31, 2005 at 07:13:02 (UTC)
Goto Top
Moin, hasenfuss,

1.) wenn Du tatsächlich das Erstellungsdatum haben willst, musst du einen anderen Weg gehen. Die "%%~t.." -Option des FOR..IN..DO..-Befehls zeigt immer das letzte Änderungsdatum.

Du müsstest also schon anders anfangen. Hier noch mal der Unterschied:

<= 8:46:24 C:\Dokumente und Einstellungen\Biber=>a) Änderungsdatum
for /F "delims=" %f in ('dir /a-D /-C logfile*.*^|find "."') do @echo %f
20.06.2005 16:54 322 logfile
20.06.2005 16:54 500 logfile1

<= 8:46:57 C:\Dokumente und Einstellungen\Biber=>b) Erstellungsdatum
for /F "delims=" %f in ('dir /a-D /Tc /-C logfile*.*^|find "."') do @echo %f
09.05.2005 10:40 322 logfile
10.05.2005 10:54 500 logfile1

2.) Aber auch im Fall "Änderungsdatum" wird es schwierig, das als Einzeiler zu machen.
Egal welches Datum, du musst die Datums/Zeitwerte des Dir-Outputs in einer Variable speichern und kannst erst dann alle Substring-Frunktionen darauf anwenden, um Dir das in die Reihenfolge JJJJ-MM-TT hh-min zu bringen.

Also im Batch ungefähr:
...---(Ungetestete Skizze renameMitDatum.dat)
for /F %%f in ('dir /a-D /Tc /-C ^|find "."') do call :loop %%f %g %h %i
goto HauInsMett
:loop
Echo (Debug) Datei: %4 Cr-Datum/Zeit: %1 %2
set DirDatetime=%1%2
set MyDateTime=%DirDateTime:~6,4%-%DirDateTime:~3,2% ....usw
REM MydateTime im Format JJJJ-MM ....usw
rename %~f4 %MyDateTime%%~x4
goto :eof
Anmerkung
%~f4 bedeutet vollständiger Dateiname der (Original-)Datei
%~x4 bedeutet Endung der (Original-)Datei
:hauInsMett
Ende von---(Ungetestete Skizze renameMitDatum.dat)

3)
>nur einen Syntaxfehler angezeigt bekomme, weil das Datum und die Uhrzeit mit einem Leerzeichen getrennt sind.
Die Leerzeichen macht wenig aus. Problem sind die ":" in der Zeitangabe als unerlaubte Zeichen. face-wink

HTH
Frank / der Biber aus Bremen
Member: Metzger-MCP
Metzger-MCP Aug 31, 2005 at 09:06:37 (UTC)
Goto Top
Leute es geht auch relativ einfach anders.

Ich weis zwa nicht welche Funktion ich wie für welches Feld wann angeben muß, aber
denoch gibt es einen einfachen Weg, der am Anfang ein bissel aufwendiger ist, am Ende
aber simple un immer wieder verwendbar.

Lese doch die Dateinamen und alle nötigen Werte aus und lasse Sie dann in eine Datei schreiben.

Dir c:\ > root.txt

Importiere dir diese Datei in Excel so ( Blatt 1 ), das du für jede Info eine eigene Spalte hast ( Leerstelle als Trennzeichen oder ). Nun kannst du dir die deine Informationen wie du Sie brauchst im Blatt 2 Spaltenweise sortieren. Zum Schluss brauchst du dir nur auf Blatt 3 alles passent verketten. ( Hier kann dann stehen REN "c:\1234567" "c:\237647234" )
Dies kanst du dir dann wieder in eine txt Datei exportieren, umbenennen. Ausführen.

Mfg Metzger
Member: Biber
Biber Aug 31, 2005 at 09:21:51 (UTC)
Goto Top
@metzger
Ist natürlich einfacher als ein Doppelklick auf einen Batch oder das automatische Starten des Batches als Dienst *lachtsichwech*..

Thx für den Hinweis - ich halt mich gern etwas zurück mit den Bätchen.
Habe noch ein oder zwei andere Hobbies gottseidank. face-wink
Member: Metzger-MCP
Metzger-MCP Aug 31, 2005 at 09:40:48 (UTC)
Goto Top
So sollte das nicht gemeint sein, schreibe und poste ruhig weiter gute Bätchen ! face-smile

Batchdatein ausführen, manual oder als service ist natürlich einfacher als imort export ...

Ich denke nur, bei meiner Lösung kann man schauen ob alles wirklich so aussieht wie es sein soll, bevor ich etwas umbenenne. Nicht jeder ist so ein Batch Fachmann wie deiner einer, obwohl ich auch noch aus den guten alten Dos 5.0 Zeiten komme.

Denke mit mehrere Lösungen muß man nicht unbedingt schlechter Leben oder ???

Mfg Metzger
Member: Biber
Biber Aug 31, 2005 at 11:19:45 (UTC)
Goto Top
@metzger

Keine Sorge, ich war nicht ernsthaft geknickt..
aber bei dieser speziellen Anforderung (in einem bestimmten Ordner alle Dateien mit Zeitstempel umbenennen/ wegkopieren) - da bietet sich schon eine Batchlösung an, weil..

- gibt wenig, was ich manuell "richtiger" machen kann als ein einmal festgeschriebener Algorithmus

- ich habe keinen Verwaltungsaufwand (der Stress bei der Excel-Lösung geht spätestens dann los, wenn ich 2 ausgedruckte Versionen der 2x3 Seiten nebeneinander halte oder versuche, eine Datei wiederzufinden, die nun doch manuell einen vollkommen anderen Namen zugewiesen bekommen hat)

- und drittens: selbst wenn die Batchskizze noch ein wenig verfeinert wird (die Umkopier/Umbenennklamotte mitprotokollieren oder ähnliche nice-to-haves)
..auf mehr als 30 oder 35 Zeilen kann man/frau das Bätchelchen gar nicht aufblasen, auch wenn die Kommentarzeilen in Limerickform geschrieben werden. Das halte ich noch für einen kalkulierbaren Aufwand, den ich der täglichen/wöchentlichen Zeitersparnis gegenüberstellen kann

Wo ich Dir aber sicherlich recht gebe:
Der erste selbstgeschiebene Batch dauert wesentlich länger, als den ganzen Vorgang 20x hintereinander manuell abzufackeln und
mehrere Lösungswege sind natürlich besser einer oder als immer eine Standard-Antwort auf alle Probleme zu geben. Bin da auch nicht fanatisch. Die Anzahl der geposteten Fragen, zu denen ich keinen Oneliner-Batch aufdränge ist nachweislich höher als die, wo ich das als sinnvoll/wartbar/variabel genug vertrete.

Liebe Grüße auch ausdrücklich an alle Excelaner, VB-, Java- und PHP-Scripter und KiXtarterInnen face-wink
Biber
Member: hasenfuss
hasenfuss Aug 31, 2005 at 11:29:35 (UTC)
Goto Top
Hallo,

erstmal vielen Dank für die Lösungsvorschläge. Ich hab jetzt nur noch ein kleines Problem. Bei:

rename %~f4 %MyDateTime%%~x4

kommt die Fehlermeldung Syntaxfehler, mit %~f4 erscheint der Ursprungsdateiname nicht, sondern nur ein Leerzeichen. Kann ich Uhrzeit auch noch anhängen ?

Die Lösung mit der Exeltabelle find ich auch nicht schlecht, ich werde entweder in Access oder Exel war basteln, um die Daten schneller und einfacher wieder zu finden.

Ich bin euch echt dankbar, weil ich dieses Problem schon sehr lange mitschleppe und bisher keine vernünftige Lösung gefunden habe.

Viele Grüße

hasenfuss
Member: Metzger-MCP
Metzger-MCP Aug 31, 2005 at 12:07:59 (UTC)
Goto Top
EIN LOB face-smile

Juhuu

Mfg Metzger

Ps dieser Kommentar kann gefahrlos überlesen werden und ist der sache nicht dienlich.
Member: Biber
Biber Aug 31, 2005 at 12:21:25 (UTC)
Goto Top
Sorry, hasenfuss,
das kommt vom nicht testen:#


STREICHE: for /F %%f in ('dir /a-D /Tc /-C ^|find "."') do call :loop %%f %g %h %i
SETZE......: for /F %%f in ('dir /a-D /Tc /-C ^|find "."') do call :loop %%f %%g %%h %%i

Da fehlten ein paar %-Zeichen.
Dann hast Du auch die "Zeit" dabei (Loop-Parameter %2 bzw. rechte Hälfte von %MyDateTime%). Müsstest Du an der "(Debug)"-Meldung sehen jetzt

Nun sollte es besser klappen (ist aber nach wie vor ungetestet!) Biber
Member: hasenfuss
hasenfuss Aug 31, 2005 at 12:41:50 (UTC)
Goto Top
Hallo,

nochmal vielen Dank für die Mühe. Aber leider hat sich nichts verändert. Außerdem stimmt es mit dem Datum nicht. Er "dreht" nur das aktuelle um.

for /F %%f in ('dir /a-D /Tc /-C ^|find "."') do call :loop %%f %%g %%h %%i
goto HauInsMett
:loop
Echo (Debug) Datei: %4 Cr-Datum/Zeit: %1 %2
set DirDatetime=%1%2
set MyDateTime=%DirDateTime:~6,4%-%DirDateTime:~3,2%-%DirDateTime:~0,2%
REM MydateTime im Format JJJJ-MM ....usw
rename %~f4 %MyDateTime%%~x4
goto :eof
:hauInsMett
Ende von---(Ungetestete Skizze renameMitDatum.dat)

Ich bin leider in Batch überhaupt nicht fit. Hoffentlich werd ich euch nicht lästig.

Viele Grüße

Hasenfuss
Member: Gibbon
Gibbon Aug 31, 2005 at 13:09:18 (UTC)
Goto Top
Hi,

vielleicht hilft dir meine Lösung weiter. ich habe statt den Doppelpunkten bei der Uhrzeit die jeweilige Abkürzung davor geschrieben.

for /F "tokens=1,2,3 delims=. " %%a in ('date /t') do set TIMESTAMP=%%c%%b%%a
for /F "tokens=1,2,3,4 delims=:, " %%a in ('echo %TIME%') do set TIMESTAMP=%TIMESTAMP%_h%%am%%bs%%cms%%d

for /F "delims=. tokens=1,2" %%i in ('dir testordner\ /b') do ren testordner\%%i.%%j %TIMESTAMP%.%%j
Member: Biber
Biber Aug 31, 2005 at 13:10:46 (UTC)
Goto Top
*grummelbrummelbrummel*
snipp RenamemitDatumSkizzeGetestet.bat--------------
@echo off & setlocal
for /F "Tokens=1*" %%f in ('dir /a-D /Tc /-C ^|find "."') do call :loop %%f %%g %%h %%i
goto HauInsMett
:loop
Echo (Debug) Datei: %4 Cr-Datum/Zeit: %1 %2
set DirDatetime=%1%2

REM MydateTime im Format JJJJ-MM ....usw
set MyDateTime=%DirDateTime:~6,4%-%DirDateTime:~3,2%-%DirDateTime:~0,2%_
REM JJJJ-MM-TT haben wir, noch Zeit dazu...
set MyDateTime=%MyDateTime%%DirDateTime:~10,2%h%DirDateTime:~13,2%
echo rename %~f4 %MyDateTime%%~x4
goto :eof
:hauInsMett
snipp RenamemitDatumSkizzeGetestet.bat--------------


1 ) Output bei mir:
(Debug) Datei: RenameMitDatum.bat Cr-Datum/Zeit: 31.08.2005 14:46
rename E:\RenameMitDatum.bat 2005-08-31_14h46.bat

2.) Zeile ECHO (Debug)... kann gelöscht/ ausgeREMt werden nach dem Testen.
Ebenso natürlich NACH dem Testen aus dem "ECHO rename" ein "Rename" oder "Copy" machen.

3) Ein ständiges "Rename" im selben Verzeichnis bringts natürlich nicht, ich würde die Dateien in ein anderes Verzeichnis kopieren und in diesem hier löschen.

4) je nachdem, was bei Euch für länderspezifische Einstellungen aktiv sind, können sich die date/time-Formate verschieben. Also ggf. anpassen bei englischer/amerikanischer oder Oldenburger-Platt-Ländereinstellung.

Hope That Helps & Hoff Das Wars

Biber aka einer der Belastbarsten face-big-smile
Member: hasenfuss
hasenfuss Aug 31, 2005 at 18:39:27 (UTC)
Goto Top
Hallo Biber,

vielen Dank für deine Mühe. Jetzt gehts. Danke.

Viele Grüße

Hasenfuss
Member: Biber
Biber Aug 31, 2005 at 19:05:26 (UTC)
Goto Top
Ok, Hasenfuss,
freut mich. Da das immer noch die Version 0.20 ist... *gg

Noch die Anmerkung: Der Batch läuft NICHT mit Dateinamen, die Leerzeichen beinhalten.
Dazu müssten noch in drei Zeilen ein paar Zeichen rein, aber solange es niemand vermisst.. ich erwähne es nicht *feix*
Sollte ja mehr eine Skizze sein, schöner und bunter machen ist sicherlich möglich.

Grüße zurück

Biber
P.S. Bist Du sicher, dass Du mit dem "Erstellungsdatum" keinen Denkfehler machst? Wenn neuere Versionen einer Datei "kommen", wo auch immer Du die herbekommst, werden die immer über die bereits vorhandenen drübergenagelt. Bzw. im Rename-Fall bekommst Du eine aufs Maul ("Unable to rename-File exists") und im COPY-Fall ist die Vorgängerversion wech.
Mir egal, works as designed , wie die Programmierer immer wissend sagen, aber fragen wollte ich schon mal...
Member: hasenfuss
hasenfuss Aug 31, 2005 at 23:38:14 (UTC)
Goto Top
Hallo Biber,

ich glaub es funktioniert. Die Dateien sind im *.tif Format. Ein Programm, dass Faxe verwaltet speichert die Dateien. Der Name ist ein Zahlenbuchstabengewirr. Leider haben sich bei mir ein paar 1000 Dateien angesammelt und ich kann nicht erkennen, wann welche Datei gespeichert worden ist. Das Programm muss weg, weil es pro Jahr ein Haufen Geld kostet. Aber die alten Dateien brauch ich noch. Ich hoffe mit dem Batch funktiert ist jetzt endlich.

Nochmals vielen Dank. Du hast mir echt geholfen. Ich werd mich mit den Batchen jetzt mehr auseinander setzten. Die sind echt total praktisch.

Viele Grüße

hasenfuss
Member: bANDYt
bANDYt Oct 16, 2006 at 14:50:02 (UTC)
Goto Top
Noch die Anmerkung: Der Batch läuft
NICHT mit Dateinamen, die
Leerzeichen beinhalten.
Dazu müssten noch in drei Zeilen ein
paar Zeichen rein, aber solange es niemand
vermisst.. ich erwähne es nicht *feix*

Doch ich hier vermisse die "drei Zeilen" face-wink

Ich habe mir mal Deine Batch "RenamemitDatumSkizzeGetestet.bat" ausgeliehen und etwas umgebastelt.
Geht auch soweit wie ich mir das verstelle, nur mit den Leerzeichen im Dateinamen komm ich nicht klar face-sad

mfg
Andy

@echo off & setlocal
for /F "Tokens=1*" %%f in ('dir /A-D /T /-C ^|find "."') do call :loop %%f %%g %%h %%i
goto ende
:loop
echo (Debug) Datei: %4 Dateidatum: %1
set DirDatetime=%1
REM MydateTime im Format JJJJ-MM
set MyDateTime=%DirDateTime:~6,4%-%DirDateTime:~3,2%
REM Dir JJJJ-MM erstellen
if exist %~d4%~p4%MyDateTime% goto :move
echo (Debug) md %~d4%~p4%MyDateTime%
REM Datei dorthin verschieben
:move
echo (Debug) move %~f4 %~d4%~p4%MyDateTime%\%~n4%~x4
goto :eof
:ende
Member: Biber
Biber Oct 16, 2006 at 17:27:22 (UTC)
Goto Top
Moin bANDYt,

o je... Jugendsünden...

Aus heutiger Sicht würde ich einen derartigen Batch etwas anders schreiben und wenigstens zwei (optionale) Parameter vorsehen.
[Parameter1: Dateimaske, z.B. *.doc oder *.tif,
Parameter2: Lw/Verzeichnis, in dem das Ganze laufen soll.

Das würde dann auf Basis Deiner Anpassungen so aussehen können:
::------snipp MoveMitDatumUndLeerzeichen.bat
@Echo off & setlocal
pushd %2
for /F "delims=" %%f in ('dir /b %1') do call :loop "%%f"  
PopD
goto :eof 
:loop 
echo (Debug) Datei: %1 Dateidatum: %~t1
REM MydateTime im Format JJJJ-MM
for /f "tokens=2,3 delims=. " %%i in ("%~t1") do set MyDateTime=%%j-%%i  
REM Dir JJJJ-MM erstellen
if not exist "%~dp1%MyDateTime%" echo (Debug) md "%~dp1%MyDateTime%"  
REM Datei dorthin verschieben
echo (Debug) move "%~f1" "%~dp1%MyDateTime%\%~nx1"  
goto :eof 

Gruß
Biber
Member: bANDYt
bANDYt Oct 17, 2006 at 22:25:09 (UTC)
Goto Top
Danke Biber, http://www.cheesebuerger.de/images/more/schilder/n050.gif !

Parameter1: Dateimaske, z.B. *.doc oder *.tif
funktioniert prächtig!
Parameter2: Lw/Verzeichnis, in dem das Ganze laufen soll.
Läuft irgendwie nicht...(oder ich mach was verkehrt), ist aber auch nicht schlimm, da kann ich gut damit leben.

Hast Du noch eine Idee, wie man es verhindern kann, dass die Batch sich selbst verschieben möchte? Ausser diese als schreibgeschützt und/oder versteckt zu markieren.


===> direkt im Verzeichnis gestartet, alles paletti face-smile
I:\Test>MoveMitDatumUndLeerzeichen.bat
(Debug) Datei: "bla bla bla.txt" Dateidatum: 03.03.2003 00:03
(Debug) md "I:\Test\2003-03"
(Debug) move "I:\Test\bla bla bla.txt" "I:\Test\2003-03\bla bla bla.txt"
(Debug) Datei: "bla bla.txt" Dateidatum: 02.02.2002 00:03
(Debug) md "I:\Test\2002-02"
(Debug) move "I:\Test\bla bla.txt" "I:\Test\2002-02\bla bla.txt"
(Debug) Datei: "bla.txt" Dateidatum: 01.01.2001 00:03
(Debug) md "I:\Test\2001-01"
(Debug) move "I:\Test\bla.txt" "I:\Test\2001-01\bla.txt"
(Debug) Datei: "MoveMitDatumUndLeerzeichen.bat" Dateidatum: 16.10.2006 19:33
(Debug) md "I:\Test\2006-10"
(Debug) move "I:\Test\MoveMitDatumUndLeerzeichen.bat" "I:\Test\2006-10\MoveMitDa
tumUndLeerzeichen.bat"

===> aus einem anderen Verzeichnis oder Laufwerk aus gestartet:
H:\>MoveMitDatumUndLeerzeichen.bat i:\test
(Debug) Datei: "bla bla bla.txt" Dateidatum:
(Debug) move "H:\bla bla bla.txt" "H:\\bla bla bla.txt"
(Debug) Datei: "bla bla.txt" Dateidatum:
(Debug) move "H:\bla bla.txt" "H:\\bla bla.txt"
(Debug) Datei: "bla.txt" Dateidatum:
(Debug) move "H:\bla.txt" "H:\\bla.txt"
(Debug) Datei: "MoveMitDatumUndLeerzeichen.bat" Dateidatum: 16.10.2006 19:33
(Debug) md "H:\2006-10"
(Debug) move "H:\MoveMitDatumUndLeerzeichen.bat" "H:\2006-10\MoveMitDatumUndLeer
zeichen.bat"
Member: Biber
Biber Oct 18, 2006 at 08:58:38 (UTC)
Goto Top
Moin bANDYt,

MoveMitDatumUndLeerzeichen.bat i:\test
--> der Parameter "Lw\pfad" funktioniert schon, aber der wird ja als zweiter erwartet.
also wäre richtiger:
MoveMitDatumUndLeerzeichen.bat *.* i:\test
...denn der erste der beiden optionalen Parameter wird als filemask für den DIR-Befehl interpretiert.

Zur zweiten Frage ("Wie kann ich verhindern, dass die ausführenede *.bat-Datei selbst mit verschoben wird..?")
::MoveMitDatumUndLeerzeichen.bat
@Echo off & setlocal
pushd %2
for /F "delims=" %%f in ('dir /b <b>/a-d</b> %1 <b>^2^>nul</b>') do <b>if /i %%~sf NEQ %~s0</b> call :loop "%%f"  
<b>popD & </b>goto :eof 
:loop 
echo (Debug) Datei: %1 Dateidatum: %~t1
REM MydateTime im Format JJJJ-MM
for /f "tokens=2,3 delims=. " %%i in ("%~t1") do set MyDateTime=%%j-%%i  
REM Dir JJJJ-MM erstellen
if not exist "%~dp1%MyDateTime%" echo (Debug) md "%~dp1%MyDateTime%"  
REM Datei dorthin verschieben
echo (Debug) move "%~f1" "%~dp1%MyDateTime%\%~nx1"  
goto :eof 

[Ergänzungen sind fett hervorgehoben, das "PopD" hatte ich vergessen letztes Mal.]

Anmerkungen:
Die Zeitermittlung geht hier auf das letzte Änderungsdatum der Datei.
Sollte wieder das Erstellungsdatum gewünscht sein, dann ist der weiter oben beschriebene Umweg über die tabellenartige "DIR /Tc .."- Ausgabe nötig.
Der "%%~t"-Parameter nimmt jedenfalls immer das Änderungsdatum AFAIK.

Falls keine passenden Dateien in dem Verzeichnis sein sollten, würde vom DIR-Befehl eine Fehlermeldung erzeugt werden "Datei nicht gefunden".
Die wiederum zu Folgefehlern führen würde, da dieser Text an den :LOOP-Block weitergereicht wird.

Abfangen läst sich dieser Effekt durch Umleitung der Fehlerausgabe ("Dir *.xyz 2>nul").
Da hier wieder ein bisschen was maskiert werden muss, sieht es etwas kryptisch aus oben... ist nicht so wichtig. Einfach hinnehmen.

Gruß
Biber
Member: bANDYt
bANDYt Oct 19, 2006 at 20:45:25 (UTC)
Goto Top
Servus Biber,

--> der Parameter "Lw\pfad" funktioniert schon, aber der wird ja als zweiter erwartet.
Ah, jetzt ja! Nun hab ich es auch kappiert. face-wink

Zeile 7: "echo (Debug) Datei: %1 Dateidatum: %~tc1" macht Ärger: "Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters ist ungültig: %~tc1"

Das c gestrichen
echo (Debug) Datei: %1 Dateidatum: %~tc1
und alles ist gut.

Aber es funktioniert alles so, wie ich es wollte! Eher noch mehr.

Ich dank' Dir recht sakrisch, Biber.

Gruß
bANDYt
Member: Biber
Biber Oct 19, 2006 at 20:54:09 (UTC)
Goto Top
Gern geschehen, bANDYt,

und das mit dem "~tc1" muss mir hier im Forum beim Formatieren des Kommentars passiert sein...
.. ich habe oben in meinem Kommentar Deine Lösung (Streichen des Buchstaben "c") nachgezogen *gg

So, diesen Beitrag hier setze ich auf "Geschlossen" - hier dürften keine Fragen mehr offen sein.

Schönen Abend
Biber