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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 15202
Url: https://administrator.de/forum/erstellungsdatum-auslesen-und-als-neuen-dateinamen-verwenden-15202.html
Ausgedruckt am: 23.12.2024 um 14:12 Uhr
20 Kommentare
Neuester Kommentar
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
20.06.2005 16:54 500 logfile1
<= 8:46:57 C:\Dokumente und Einstellungen\Biber=>b) Erstellungsdatum
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.
HTH
Frank / der Biber aus Bremen
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 logfile20.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 logfile10.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.
HTH
Frank / der Biber aus Bremen
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
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
So sollte das nicht gemeint sein, schreibe und poste ruhig weiter gute Bätchen !
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
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
@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
Biber
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
Biber
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
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
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
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
*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
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
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...
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...
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*
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"
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
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
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
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:
Gruß
Biber
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
Danke Biber, http://www.cheesebuerger.de/images/more/schilder/n050.gif !
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
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"
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
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"
Moin bANDYt,
also wäre richtiger:
Zur zweiten Frage ("Wie kann ich verhindern, dass die ausführenede *.bat-Datei selbst mit verschoben wird..?")
[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
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
Servus Biber,
Zeile 7: "echo (Debug) Datei: %1 Dateidatum: %~tc1" macht Ärger: "Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters ist ungültig: %~tc1"
Aber es funktioniert alles so, wie ich es wollte! Eher noch mehr.
Ich dank' Dir recht sakrisch, Biber.
Gruß
bANDYt
--> der Parameter "Lw\pfad" funktioniert schon, aber der wird ja als zweiter erwartet.
Ah, jetzt ja! Nun hab ich es auch kappiert. 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.
echo (Debug) Datei: %1 Dateidatum: %~t
und alles ist gut.
Aber es funktioniert alles so, wie ich es wollte! Eher noch mehr.
Ich dank' Dir recht sakrisch, Biber.
Gruß
bANDYt
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
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