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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 130676
Url: https://administrator.de/forum/wie-einen-konstanten-string-in-dateinamen-einfuegen-130676.html
Ausgedruckt am: 07.04.2025 um 07:04 Uhr
8 Kommentare
Neuester Kommentar
Hallo Shergotty!
Würde es sich nicht eher anbieten, den String nach den ersten 13 Zeichen (Datum + " - ") einzufügen? In diesem Fall:
Grüße
bastla
P.S.: "
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
bastla
P.S.: "
enabledelayedexpansion
" ist bei Verwendung eines Unterprogrammes überflüssig und bei Dateinamen mit enthaltenen "!" kontraproduktiv ...
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.
Beides zusammen als Proof-of-Concept am CMD-Prompt:
--> Ich würde es also mit zwei FOR-Anweisungen hintereinander geschaltet machen.
Grüße
Biber
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
Hallo Shergotty!
aufrufen. Die Verarbeitung von Teilstrings wird dort am Beispiel der Variablen %PATH% gezeigt.
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 ...
Grüße
bastla
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 mitset /?
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%"
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%"
bastla
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):
... 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
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"
)
)
--> 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