pemue
Goto Top

Dateinamen ändern in: Erstellungsdatum Erstellungszeit Name

[Edit] Aus meiner Sicht beantwortet. Biber [/Edit]

Erstmal ein wunderschönes Jahr 2006 an alle.

Hab mich hier schon reichlich umgesehen, komme aber nicht weiter.Will folgendes tun:
eine Reihe von Dateien in einem Verzeichnis soll nach folgenden Schema umbenannt werden:

alter name: audio__172.3800_2006-01-01_16-18-50_to_2006-01-01_16-18-51.wav

neuer name: %Erstellungsdatum(JJJJ.MM.TT)%_%Erstellungszeit(HH:MM:SS)%_%Neuer Name für 172.3800(Kanal-A)%.wav

Eine Übersetzungsliste für Kanal-A, Kanal-B etc liegt in einer set.cmd nach dem Muster bei:

set 172.3800=Kanal-A
set 85.6750=Kanal-B
etc.
(sind ca 120 Frequenzen)

Ich hoffe auf eure Hilfe.
Pemue

Content-Key: 22572

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

Printed on: April 25, 2024 at 09:04 o'clock

Member: Biber
Biber Jan 01, 2006 at 21:53:09 (UTC)
Goto Top
Moin Pemue,
Dir auch ein erfolgreiches oder zumindest unterhaltsames Jahr 2006.

In dem <a href= target="blank"> Batch-Tut III </a> steht unter anderen eine GetAllDateTimeInfos.bat bereit zum Copy & Paste'n. Am besten vorher auf Druckansicht umschalten wegen der Zeilenumbrüche.

Die liefert Dir alle Datums- und Zeitvariablen mit folgendem auch abgedruckten Grundgerüst:

Call GetAllDateTimeInfos /s
(alle Variablen sind gesetzt)
set logfilename=%JJ%-%MM%-%TT%_%hh%$%min%.log
Call GetAllDateTimeInfos /u

Für die restliche Übersetzung (die Frequenzen) würde ich eine Schleife über diese merkwürdige Set.cmd laufen, wenn die schon mal da ist.
Ich nutze die jetzt allerdings nicht als Batchdatei, sondern als normale x-beliebiege Textdatei.

Wenn es eine einmalige Aktion ist, würde ich es direkt in einer *.bat-Datei machen.

Ungetestete Skizze:
::---------snipp RenameWavs.Bat
@echo off & setlocal
Pushd X:\Verzeichnis\Mit\Den\Umzubenennenden\Dateien
:: For..IN..DO..Anweisung über alle Dateien ....
for /f "tokens=2,3 delims== " %%i in (Pfad\zur\set.cmd) do call :HandleFreq %i %j  
Call GetAllDateTimeInfos /u 
PopD
goto :eof
~~~~Ende der Schleife über alle 120 Frequenzen; Ende des Batches
:HandleFreq Para1 ist alteFreq wie 172.3800; Para2 ist neuerFreqName Kanal-A
FOR /F %%a in (Dir /b /A:-d audio__%1_*.wav) Do Call :RenameThem %%a %2 %%~ta
goto :eof
~~~ Ende der Schleife über alle Dateien mit Freq 172.3800...etc. im Namen
:RenameThem ...Para1 ist Filename; Para2 neuerFreqName 
:: Parameter 3 ist das Dateidatum Para4 die Dateizeit
Call GetAllDateTimeInfos /s %3 %4
:: (alle Variablen sind gesetzt auf die Datei-Erstellungszeit) 
:: Vorgabe :alter name: audio__172.3800_2006-01-01_16-18-50_to_2006-01-01_16-18-51.wav
:: .........neuer name: %Erstellungsdatum(JJJJ.MM.TT)%_%Erstellungszeit(HH:MM:SS)%_%Neuer Name für 172.3800(Kanal-A)%.wav 
Ren %1 %JJ%%MM%%TT%_%HH%h%MM%m%SS%_%2
goto :eof
:: ---------snapp RenameWavs.bat

Geändert habe ich bei der Umnbenennerei die Doppelpunkte bei der Zeitangabe ("22:53:07") in "22h53m07", weil Doppelpunkte in Dateinamen nur Unbill provozieren.*gg

Pfade zu Deinen *.wav-Dateien, zur GetAllDateTimeInfos.bat und zur Set.cmd musst Du bitte anpassen.
HTH Biber
Member: Pemue
Pemue Jan 02, 2006 at 17:47:29 (UTC)
Goto Top
Hallo Biber.

Vielen Dank erstmal für die schnelle Skizze.
Nach einiger bastelei hab ich sie zum laufen bekommen.
Noch ein Problem gibts:

FOR /F %%a in ('Dir /b /A:-d audio__%1_*.wav') Do Call :RenameThem %%a %2 %%~ta

gibt leider Datum und Zeit ohne Sekunden aus.
Die sind aber wichtig, da in einer Minute mehrere Files erstellt werden und sich somit Filenamen doppeln würden. Gibts da ne andere Lösung?

Pemue
Member: Pemue
Pemue Jan 02, 2006 at 17:57:18 (UTC)
Goto Top
sorry noch ein Nachsatz:

es kann auch das Änderungsdatum sein, weil ist identisch und wird nich geändert.

GRüsse
Member: Biber
Biber Jan 02, 2006 at 19:44:17 (UTC)
Goto Top
Hmmm, Pemue,

ich hab Deine Antwort grad gelesen und auch mal schnell durchprobiert - bei den CMD-Befehlen scheint erstmal kein von M$ mitgelieferter dabeizusein, den ich zur Übergabe/Anzeige der Sekunden von Erstellungs./Änderungsdatum überreden könnte.

Auch die Herumschrauberei an Einstellungen/Ländereinstellungen/Uhrzeit ändert nichts daran, auch wenn dort das Uhrzeit-Format mit Sekunden und meinetwegen Hundertsel-Sekunden eingestellt ist (am schnellsten überprüfbar bei den DIR-Ausgaben).

Lediglich bei der GUI-Anzeige im Explorer läßt sich M$ dazu überreden, unter "Eigenschaften" einer Datei auch die Sekundenwerte mit auszugeben.

Also... Alternativstrategien:
a) einer von uns treibt ein Konsolen-Utilitity auf, dass die Dateierstellungs-/Dateiänderungsdatumswerte mit Sekunden anzeigt--- selbst das M$-Filever-Utilitily macht das nicht *grummel*
b) einer von uns schreddert 5 Zeilen in Java-Script oder VB-Skript zusammen, die das tun
c) Wir übernehmen die Informationen aus dem alten Dateinamen, da stehen sie ja schon
d) Wir fügen zwei, drei Zeilen in den Batch ein zur Behandlung von Dateinamens-Kollisionen... dann heißt eben die zweite Datei (SülzDiBülz)A.wav und die dritte (SülzDiBülz)B.wav...

Mir egal, welche Variante...

Gruß Biber

P.S. Aber Kollisionen können doch nur auftreten, wenn diese Jingles auch in der gleichen Minute auf dem gleichen Kanal gesendet werden. Was sind das denn für *.wav's? Werbespots? Dann gibt es auch zentrale Sendelisten, in denen die Spots mit VON/BIS-Zeiten angekündigt/protokolliert werden...
Member: Pemue
Pemue Jan 03, 2006 at 00:06:58 (UTC)
Goto Top
hallo biber.

nochmals danke für deine hilfe. wär sonst echt aufgeschmissen.

zum ps: sind aufnahmeschnipsel wie man sie aus dem amateurfunkbereich kennt. oft nur wenige sekunden lang, auf verschiedenen kanälen nacheinander aufgenommen. innerhalb einer minute fallen da bis zu zehn schnipsel an.

hab mich mal testhalber auf strategie c) gestürzt:

@echo off & setlocal
Pushd D:\server\rec\test
for /f "tokens=1,2 delims= " %%i in (D:\batch\set.txt) do call :DateiName %%i %%j
Call D:\batch\GetAllDateTimeInfos /u
PopD
goto :eof
~~~~Ende der Schleife über alle 120 Frequenzen; Ende des Batches

:DateiName
set Frequenz=%1
set Kanal=%2
FOR /F %%a in ('Dir /b /A:-d audio__%Frequenz%_*.wav') Do Call :Datum %%a %2
goto :eof
~~~ Ende der Schleife über alle Dateien mit Freq 172.3800...etc. im Namen

:Datum
set OrgDatei=%1
for /F "tokens=3,4 delims=_" %%b in ('dir /b audio__%fre%_*.wav') do Call :DatumRev %%b %%c
goto :eof

:DatumRev
set Datum=%1
set Time=%2
for /F "tokens=1,2,3 delims=." %%c in ("%Datum%") do Call :Rename %%c %%d %%e
goto :eof

:Rename
set DD=%1
set MM=%2
set JJ=%3
ren %OrgDatei% %JJ%.%MM%.%DD%_%Time%_%Kanal%.wav
goto :eof

wahrscheinlich aus der sicht des profis nicht optimal und hat auch einen haken:

die zeile:
for /F "tokens=3,4 delims=_" %%b in ('dir /b audio__%fre%_*.wav') do Call :DatumRev %%b %%c
liefert mir für alle gleiche frequenzen (z.b. 172.3800) die selbe zeit inclusive der sekunden.
führt dann wieder zur kollision bei der umbenennung.

und noch ne zweite schwäche:
wenn %172.3800% im verzeichnis grad nicht existiert (weil vielleicht schon umbenannt) gibts immer wieder die schöne meldung: ...das system kann die datei nicht finden.

hilfreich wäre eine @if exist (%172.3800%) schleife.
nur wie geht das???

danke für die geduld
pemue
Member: Biber
Biber Jan 03, 2006 at 00:31:04 (UTC)
Goto Top
*lacht*
Welche Geduld, Pemue?
Bin ja froh, dass ich hier einen ruhigen Thread finde, wo nicht dauernd irgendwelche punkte-geierigen Chatter dazwischenquaken.. Die beharken sich inzwischen schon, wenn es um die beste Methode zur Trojanerentsorgung geht.. *kopfschüttel*

Ich nehme mir Deinen Ansatz mal mit und schau es mir in Ruhe an.

Wir bekommen das schon hin.
Aber jetzt mach ich erstmal etwas outside of forum face-wink

Bis dann
Biber
Member: Biber
Biber Jan 03, 2006 at 14:03:51 (UTC)
Goto Top
Moin Pemue,

ich versuch mal, die Mimik zum Rausfieseln der Uhrzeiten aus dem "alten" Dateinamen in einem Zwischenschritt herzuleiten, bevor ich das in den Batch einbaue.

Die Strategie war ja wie folgt:
a) aus einer Liste (set.txt) auslesen, welche Frequenzen wir überhaupt übersetzen können.
Den Job macht die Hauptschleife, die dann für alle Freqenzen die "Unterroutine ":Dateiname" ruft. Klappt.
b) diese ":Dateiname" ermittelt alle Dateinamen mit dieser Frequenz im Namen.Klappt auch.
c) Mit jedem einzelnen dieser Dateinamen soll die Umbenennerei stattfinden,
Das über ich jetzt mal am CMD-Prompt.
In der Klammer der FOR...IN..DO Anweisung steht jeweils der Dateiname ohne Extension,
z.B. der Name "audio__172.3800_2006-01-01_16-18-50_to_2006-01-01_16-18-51".

(ist eine Eingabezeile, auch wenn es in der Darstellung umgebrochen wird)
$cmd$ for /f "tokens=1-15 delims=-_" %a in
("audio__172.3800_2006-01-01_16-18-50_to_2006-01-01_16-18-51")
do @echo %a %b %c %d %e %f %g %h %i %j %k %l &m %n %o

(Output)
audio 172.3800 2006 01 01 16 18 50 to 2006 01 01 16 18 51

("audio"=%a;"172.3800"=%b; "2006"=%c"; "01"=%d "01"=%e; "16"=%f ...
...etc für 18 50 to 2006 01 01 16 18 51
Also, gute Nachricht: wenn ich den alten Dateinamen mit "-" und "_" als Trennzeichen zerlege, habe ich alle nötigen Informationen inclusive der Sekundenangabe.
Ich muss nur ein bisschen abzählen. Da ja nun sogar zwei Zeiten mit Sekundenangaben da sind, entscheide ich mich mal für die Ende-Zeit - kommt der Erstellungszeit am nächsten.
Wenn ich nur die brauche, sind das die letzten Tokens Ende-Datum "2006 01 01" und Ende-Zeit "16 18 51", also kann ich die Schleife vereinfachen.

$cmd$ for /f "tokens=10-15 delims=-_" %a in ("audio__172.3800_2006-01-01_16-18-50_to_2006-01-01_16-18-51") do @echo %a %b %c %d %e %f
(Output)
2006 01 01 16 18 51

Wenn die Kombination "Frequenz" und "Sende-Endezeitpunkt" bei Dir eindeutig ist, dann können wir jetzt die ursprüngliche Skizze ziemlich weit zusammendampfen, denn auch die Ermittlung des Dateidatums ist jetzt überflüssig.
:: -----snipp RenameWavs2.bat Ungetestete Skizze!!
@echo off & setlocal 
Pushd D:\server\rec\test
for /f "tokens=1,2 delims= " %%i in (D:\batch\set.txt) do call :DateiName %%i %%j  
PopD
goto :eof
~~~~Ende der Schleife über alle 120 Frequenzen; Ende des Batches

:DateiName ...übergibt je EINEN gefundenen Dateinamen OHNE .wav
set "Frequenz=%1" && Rem Nur wegen der Lesbarkeit gesetzt  
set "Kanal=%2" && Rem Nur wegen der Lesbarkeit gesetzt; kann als %2 übergeben werden  
FOR /F %%a in ('Dir /b /A:-d audio__%Frequenz%_*.wav') Do Call :Datum %%~na %2  
goto :eof
~~~ Ende der Schleife über alle Dateien mit Freq 172.3800...etc. im Namen 

:Datum ACHTUNG Para1 (orgDatei) kommt jetzt OHNE Extension an
:: <s>set "OrgDatei=%1</s>  %Kanal% ist auch als Para2 verfügbar. 
for /f "tokens=10-15 delims=-_" %%a in ("%1") do (  
 ren %1.wav %%a-%%b-%%c_%%d_%%e_%%f_%Kanal%.wav
 )
goto :eof 
:: RenameWavs2.bat---------------------------

Und dieses Problem kann auch nicht mehr auftreten: [Edit] ..dachte ich - s. unten [/Edit]
und noch ne zweite schwäche:
wenn %172.3800% im verzeichnis grad nicht existiert (weil vielleicht schon umbenannt)
gibts immer wieder die schöne meldung: ...das system kann die datei nicht finden.
hilfreich wäre eine @if exist (%172.3800%) schleife.

HTH Biber
Member: Pemue
Pemue Jan 03, 2006 at 23:00:41 (UTC)
Goto Top
mit dem umbenennen klappt jetzt super. bin begeistert.
aber das problem mit dem ...kann datei nicht finden... hab ich noch.
liegt daran, das aus der set.txt frequenzen eingelesen werden, die in diesem zeitraum gar nicht aufgenommen werden.

da muss also doch irgendwo eine if anweisung hin. if audio__%Frequenz%_*.wav not exist soll er bitteschön halt mit der nächsten frequenz weitermachen.
Member: Biber
Biber Jan 03, 2006 at 23:15:40 (UTC)
Goto Top
Ach so, Pemue,
sorry, hatte ich ganz vergessen... wenn es weiter nix ist... face-wink

Also, da würde ich hier in diesem Block ansetzen:

...
DateiName ...übergibt je EINEN gefundenen Dateinamen OHNE .wav
if not exist audio__%1_*.wav goto :eof
set "Frequenz=%1" && Rem Nur wegen der Lesbarkeit gesetzt
set "Kanal=%2" && Rem Nur wegen der Lesbarkeit gesetzt; kann als %2 übergeben werden
FOR /F %%a in ('Dir /b /A:-d audio__%Frequenz%_*.wav') Do Call :Datum %%~na %2
goto :eof
...

Geht am Schnellsten... wenn es Dir allerdings woanders lieber ist...?? *fragend guckt*

HTH Biber
Member: Pemue
Pemue Jan 03, 2006 at 23:41:29 (UTC)
Goto Top
hallo biber.

bin noch mehr begeistert.
genau so hatte ich mir das vorgestellt. ich find das klasse, das du deine zeit für dau's wie mich opferst und dabei wirklich ne menge von dem kram verstehst.

hier nochmal für alle - denen es ähnlich wie mir geht - der funktionierende bach :

schnipp
@echo off & setlocal
Pushd D:\server\rec

delen d:\server\rec\* /[d,-3] /Y
delen d:\server\rec\* /[s0,10000] /Y

for /f "tokens=1,2 delims= " %%i in (D:\batch\set.txt) do call :DateiName %%i %%j
PopD
goto :eof
~~~~Ende der Schleife über alle 120 Frequenzen; Ende des Batches

:DateiName
if not exist audio__%1_*.wav goto :eof
set "Frequenz=%1"
set "Kanal=%2"
FOR /F %%a in ('Dir /b /A:-d audio__%Frequenz%_*.wav') Do Call :Datum %%~na %2
goto :eof
~~~ Ende der Schleife über alle Dateien mit Freq 172.3800...etc. im Namen

:Datum
:: set "OrgDatei=%1 %Kanal% ist auch als Para2 verfügbar.
for /f "tokens=4-10 delims=-_." %%a in ("%1") do (
ren %1.wav %%c-%%b-%%a_%%d-%%e-%%f__%Kanal%.wav
)
goto :eof
schnipp

gute nacht noch und vielen dank.

pemue
Member: Biber
Biber Jan 03, 2006 at 23:58:02 (UTC)
Goto Top
Uuuuups, Pemue,

jetzt kann ich aber auch von Dir lernen - was sind das denn für Zeilen?

delen d:\server\rec\* /[d,-3] /Y
delen d:\server\rec\* /[s0,10000] /Y

Ein aufgebohrter Delete-Befehl? Alles löschen, was älter drei Tage ist? Und kleiner 10000 Byte?
Wo gibts das denn?

Immer gern dazu lernend
Biber
Member: Pemue
Pemue Jan 04, 2006 at 00:06:25 (UTC)
Goto Top
in der tat. ein niedliches kleines programm mit namen delen.
hat mir viel zeit erspart... hätte dich sonst wohl noch mehr gelöchert.

pemue