shergotty
Goto Top

Wie einen konstanten String in Dateinamen einfügen?

Ich möchte meine Podcastdateien einheitlich benennen und die Quelle mit in den Namen aufnehmen. Leider hat der Sender das Ausgabeformat geändert.

gegeben:
Alle Dateien stehen wie die Batchdatei im gleichen Verzeichnis und alle Dateien sollen umbenannt werden.

Beispiele:

dir /b *.mp3

2009-09-18 - _... und Mohammed ist der Gesandte Gottes_.mp3
2009-11-26 - _digital natives_.mp3
2009-11-27 - Paolo Mantegazza_ Darwin auf Italienisch.mp3
2009-11-28 - Zeig, was du kannst! - Die Portfolio-Methode im Unterricht.mp3
2009-11-30 - Klimafaktor Wald - Nicht jeder Baum hilft gegen die Erderwärmung.mp3


gewünscht:
2009-11-30 - SWR2 Wissen_Klimafaktor Wald - Nicht jeder Baum hilft gegen die Erderwärmung.mp3


Es soll immer nach der Zeichenkette " - " (die durchaus zweimal vorkommen kann) die Zeichenkette "SWR2 Wissen_" eingefügt werden.

Ich habe schon einmal angefangen:


@echo off &setlocal enabledelayedexpansion

for /f "tokens=*" %%i in ('dir /b *.mp3') do set "name=%%i" & call :sub1 "%%i"


:sub1
echo name=%name%
set "newn=%1"
echo newn=%newn%

rem move "!name!" "!newn!"



Wenn soweit alles richtig ist, dann brauche ich nur den richtigen Umwandlungsbefehl set "newn=" .
Ich kann mir das auch selbst zusammenbasteln, wenn ich wüßte wo ich dieses Umwandlungsbefehle finden kann (Link).

Danke schon einmal und viele Grüße
Shergotty

Content-Key: 130676

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

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

Member: bastla
bastla Dec 01, 2009 at 16:53:41 (UTC)
Goto Top
Hallo Shergotty!

Würde es sich nicht eher anbieten, den String nach den ersten 13 Zeichen (Datum + " - ") einzufügen? In diesem Fall:
@echo off & setlocal

for /f "delims=" %%i in ('dir /b *.mp3') do set "name=%%i" & call :sub1 "%%i"  
goto :eof

:sub1
echo name=%name%
set "newn=%name:~,13%SWR2 Wissen_%name:~13%"  
echo newn=%newn%

rem move "%name%" "%newn%"  
goto :eof
Grüße
bastla

P.S.: "enabledelayedexpansion" ist bei Verwendung eines Unterprogrammes überflüssig und bei Dateinamen mit enthaltenen "!" kontraproduktiv ...
Member: Biber
Biber Dec 01, 2009 at 17:20:53 (UTC)
Goto Top
Moin Shergotty, Moin bastla

ich würde die Strategie etwas anders wählen und versuche das mal herzuleiten.

Die erste spontane Antwort auf die drei elementaren Fragen eines jeden Programmierproblems "Was ist mein Ziel? Was brauche ich dafür? Was davon habe ich schon?" ist doch:
"Also... im Finale brauche den REN-Befehl.... und der braucht eine umzubenennende Datei (am besten mit Lw/Pfad) und einen neuen Dateinamen... den aber ohne Lw/Pfad"
Und die sich anschließende Antwort No. 2 ist doch ebenso spontan...
"Ja hey! Die umzubenennenden Dateien bekomme ich doch ganz billich mit einer einfachen "FOR %i in (Lw:\Pfad\Wildcard)"-Anweisung ohne irgendwelches FOR/F-Token-Geraffel."
Und der Aber-Einwand "Na ja, aber für den neuen Namen brauche ich schon eine FOR /F-Anweisung mit Token-Zerlegung" löst sich schnell in Wohlgefallen auf, weil sich die Token-Zerlegerei ja reduzieren lässt auf den ersten Token bzw die erste Zeichenkette-am-Stück ("2009-11-30") und den Rest.

Ich kaspere mal am CMD-Prompt vor, was ich meine, wobei das Wesentliche, (=was gezeigt werden soll) jeweils am rechten Ende der Zeile steht.

Die beiden REN-Parameter "altername" und "neuername" habe ich in den ersten Demo-Schritten mal aufgelöst, mal nicht.

(=18:17:22  D:\temp=)
>for %a in ("e:\schnipsel\20??-??-?? - *.mp3") do @for /f "tokens=1,*" %i in ('@Echo %~nxa^|findstr /v /C:"SWR 2"') do @echo ren "altername" "%i - SWR 2 %j"  
ren "altername" "2009-11-30 - SWR 2 - Klimafaktor Wald - Nicht jeder Baum hilft gegen die Erderwärmung.mp3"  
ren "altername" "2009-11-28 - SWR 2 - Zeig, was du kannst! - Die Portfolio-Methode im Unterricht.mp3"  

(=18:17:36  D:\temp=)
>for %a in ("e:\schnipsel\20??-??-?? - *.mp3") do @for /f "tokens=1,*" %i in ('@Echo %~nxa^|findstr /v /C:"SWR 2"') do @echo ren "%a" "whatever"  
ren "e:\schnipsel\2009-11-30 - Klimafaktor Wald - Nicht jeder Baum hilft gegen die Erderwärmung.mp3" "whatever"  
ren "e:\schnipsel\2009-11-28 - Zeig, was du kannst! - Die Portfolio-Methode im Unterricht.mp3" "whatever"  

Beides zusammen als Proof-of-Concept am CMD-Prompt:
(=18:17:44  D:\temp=)
>for %a in ("e:\schnipsel\20??-??-?? - *.mp3") do @for /f "tokens=1,*" %i in ('@Echo %~nxa^|findstr /v /C:"SWR 2"') do @echo ren "%a" "%i - SWR 2 %j"  
ren "e:\schnipsel\2009-11-30 - Klimafaktor Wald - Nicht jeder Baum hilft gegen die Erderwärmung.mp3" "2009-11-30 - SWR 2 - Klimafaktor Wald - Nicht jeder Baum hilft gegen die Erderwärmung.mp3"  
ren "e:\schnipsel\2009-11-28 - Zeig, was du kannst! - Die Portfolio-Methode im Unterricht.mp3" "2009-11-28 - SWR 2 - Zeig, was du kannst! - Die Portfolio-Methode im Unterricht.mp3"  

--> Ich würde es also mit zwei FOR-Anweisungen hintereinander geschaltet machen.

Grüße
Biber
Member: Shergotty
Shergotty Dec 02, 2009 at 08:37:58 (UTC)
Goto Top
Hallo Bastla,
es funktioniert prima, vielen Dank. Auch für die kleinen Korrekturen (delims; goto :eof; ..).

Ich werde einmal den set-Befehl auseinandernehmen, um ihn besser zu verstehen.
Nach was muß ich suchen, um mir die Möglichkeiten mit set einmal anzusehen?

Ich würde gerne noch die alten Podcast umsetzen. Der einzige Unterschied besteht darin, dass das Datumsformat vor 2008 noch 20091202 war und nicht 2009-12-02. Ich möchte also immer an der 5.Stelle und 8.Stelle einen Bindestrich einfügen, der Rest des Namens bleibt erhalten.

set "newn=%name:~,4%-%name:~4%"

Damit bekomme ich den ersten Bindestrich eingefügt, also 2009-1202*
Kann ich den zweiten Bindestrich auch direkt mit einfügen oder muß ich eine zweite Schleife programmieren?

Wie kann ich genau das n.Zeichen bzw. die Zeichen n bis m löschen, also den umgekehrten Fall, um aus 2009-12-02 den Namen 20091202 zu machen?

Viele Grüße und ein großes Dankeschön
Shergotty
Member: Shergotty
Shergotty Dec 02, 2009 at 08:46:43 (UTC)
Goto Top
Hallo Biber,
auch Dir Danke für die Hilfe.

Sicherlich auch eine gute Idee alles in einer Schleifenanweisung unterzubringen. Ich kann sogar nachvollziehen, was die einzelnen Sequenzen machen, nur das %j kann ich nicht zuordnen. Es wird nirgends definiert/gesetzt.

Allerdings ist diese kompakte Variante für mich als Anfänger auf diesem Gebiet (dafür sind meine UNIX-Shell Kenntnisse wesentlich besser) schwerer nachzuvollziehen und das Script mit Unterprogramm übersichtlicher. Mit echo läßt sich auch ein Zwischenergebnis einfügen und zum Verständnis nutzen.

Trotzdem beachtlich, dass so eine kleine Aufgabe mit so unterschiedlichen Lösungsansätze erledigt werden kann.

Viele Grüße
Shergotty
Member: bastla
bastla Dec 02, 2009 at 09:12:48 (UTC)
Goto Top
Hallo Shergotty!
Nach was muß ich suchen, um mir die Möglichkeiten mit set einmal anzusehen?
Wie eigentlich bei allen CMD-Befehlen kannst Du die Online-Hilfe mit
set /?
aufrufen. Die Verarbeitung von Teilstrings wird dort am Beispiel der Variablen %PATH% gezeigt.

Ich möchte also immer an der 5.Stelle und 8.Stelle einen Bindestrich einfügen, der Rest des Namens bleibt erhalten.
Das Einfügen der Bindestriche lässt sich in einem Arbeitsgang erledigen:
set "newn=%name:~0,4%-%name:~4,2%-%name:~6%"
Für den ersten Teil habe ich versucht, die Schreibweise mit der eingefügten Null (erforderlich ist diese, wie Du schon gesehen hast, ja nicht) noch etwas deutlicher zu machen ...

Wie kann ich genau das n.Zeichen bzw. die Zeichen n bis m löschen, also den umgekehrten Fall, um aus 2009-12-02 den Namen 20091202 zu machen?
Das sähe dann analog so aus:
set "newn=%name:~0,4%%name:~5,2%%name:~8%"
Grüße
bastla
Member: Shergotty
Shergotty Dec 02, 2009 at 09:26:44 (UTC)
Goto Top
Super, jetzt habe ich sogar eine kleine Sammlung und kann dann alle Sonderfälle alleine bearbeiten.

Vielen, vielen Dank.
Shergotty, der sich gleich an die Arbeit macht
Member: Biber
Biber Dec 02, 2009 at 09:52:52 (UTC)
Goto Top
Moin Shergotty,

danke für dein Feedback.
Zwei Anmerkungen dazu.
a) "...diese kompakte Variante ist ....schwerer nachzuvollziehen..".
Ja natürlich. Aber ich war auch nur bis zum Proof-of-Concept, bis zum Antesten der Machbarkeit der Strategie am CMD-Prompt gegangen.

Eine Skriptvariante mit zur Wartbarkeit aus dem Code-Krams herausgelösten Variablen sähe auch etwas lesbarer aus.
Der letzte oben von mir gepostete Oneliner z.B. als Batch sinngemäß so (ungetestet):
::-- podcastCaster.cmd
@echo off & Setlocal
Set "PodCastdir=e:\schnipsel"  
Set "ConstStr=SWR 2 Wissen"  
FOR %%a in ("%podcastDir%\20??-??-?? - *.mp3") do (  
      FOR /F "tokens=1,*" %%i in ('Echo %%~nxa^|findstr /v /C:"%ConstStr%"') do (  
                        echo REN "%%a" "%i - %ConstStr% %%j"   
       )
)
... aber hey! ob nun so eine Umbenams-Anforderung mit 10 Zeilen "Unterprogramm"-Aufruf und Substring-Mimik oder mit 10 Zeilen und zwei hintereinander geschalteten FOR-Anweisungen abgefackelt wird...
--> wichtig ist doch nur, dass du (der ja dieses Skript ggf anpassen muss) den Algorithmus dahinter verstehst.

b) "...nur das %j kann ich nicht zuordnen. Es wird nirgends definiert/gesetzt."
Jein.... es wird implizit definiert in der Anweisung FOR /F "tokens=1,*" %i in (irgendeintext)"
Übersetzt in etwa "mach eine Zerlegung von "irgendeinText" und liefere {Token=1} und danach {Token=*"==den Rest} in die dynamischen Variablen beginnend mit %i"
Und "beginnend mit %i" heißt wiederum --> Token 1 wird als %i geliefert, Token 2 als %j [[ und ggf. Token 3 als %k usw usw ]]

Grüße
Biber
Member: Shergotty
Shergotty Dec 02, 2009 at 10:38:35 (UTC)
Goto Top
Hallo Biber,
ich habe noch mehrere Anwendungen, wo ich Dateinamen umsetzen möchte. Es kann ja nicht schaden, wenn ich es auf zwei verschiedenen Arten versuche zu lösen. Auf jeden Fall interessant ist dieses implizierte Setzen von Variablen. So etwas findet man nicht in der Hilfe /?

Auf jeden Fall sehr interessant und hilfreich.

Vielen Dank und viele Grüße
Shergotty