Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Wie einen konstanten String in Dateinamen einfügen?

Frage Entwicklung Batch & Shell

Mitglied: Shergotty

Shergotty (Level 1) - Jetzt verbinden

01.12.2009 um 13:58 Uhr, 5014 Aufrufe, 8 Kommentare

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
Mitglied: bastla
01.12.2009 um 17:53 Uhr
Hallo Shergotty!

Würde es sich nicht eher anbieten, den String nach den ersten 13 Zeichen (Datum + " - ") einzufügen? In diesem Fall:
01.
@echo off & setlocal 
02.
 
03.
for /f "delims=" %%i in ('dir /b *.mp3') do set "name=%%i" & call :sub1 "%%i" 
04.
goto :eof 
05.
 
06.
:sub1 
07.
echo name=%name% 
08.
set "newn=%name:~,13%SWR2 Wissen_%name:~13%" 
09.
echo newn=%newn% 
10.
 
11.
rem move "%name%" "%newn%" 
12.
goto :eof
Grüße
bastla

P.S.: "enabledelayedexpansion" ist bei Verwendung eines Unterprogrammes überflüssig und bei Dateinamen mit enthaltenen "!" kontraproduktiv ...
Bitte warten ..
Mitglied: Biber
01.12.2009 um 18:20 Uhr
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.

01.
(=18:17:22  D:\temp=) 
02.
>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" 
03.
ren "altername" "2009-11-30 - SWR 2 - Klimafaktor Wald - Nicht jeder Baum hilft gegen die Erderwärmung.mp3" 
04.
ren "altername" "2009-11-28 - SWR 2 - Zeig, was du kannst! - Die Portfolio-Methode im Unterricht.mp3" 
05.
 
06.
(=18:17:36  D:\temp=) 
07.
>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" 
08.
ren "e:\schnipsel\2009-11-30 - Klimafaktor Wald - Nicht jeder Baum hilft gegen die Erderwärmung.mp3" "whatever" 
09.
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:
01.
(=18:17:44  D:\temp=) 
02.
>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" 
03.
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" 
04.
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
Bitte warten ..
Mitglied: Shergotty
02.12.2009 um 09:37 Uhr
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
Bitte warten ..
Mitglied: Shergotty
02.12.2009 um 09:46 Uhr
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
Bitte warten ..
Mitglied: bastla
02.12.2009 um 10:12 Uhr
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
Bitte warten ..
Mitglied: Shergotty
02.12.2009 um 10:26 Uhr
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
Bitte warten ..
Mitglied: Biber
02.12.2009 um 10:52 Uhr
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):
01.
::-- podcastCaster.cmd 
02.
@echo off & Setlocal 
03.
Set "PodCastdir=e:\schnipsel" 
04.
Set "ConstStr=SWR 2 Wissen" 
05.
FOR %%a in ("%podcastDir%\20??-??-?? - *.mp3") do ( 
06.
      FOR /F "tokens=1,*" %%i in ('Echo %%~nxa^|findstr /v /C:"%ConstStr%"') do ( 
07.
                        echo REN "%%a" "%i - %ConstStr% %%j"  
08.
09.
)
... 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
Bitte warten ..
Mitglied: Shergotty
02.12.2009 um 11:38 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

C und C++
gelöst Anzahl der Buchstaben in einem String Element Array C++ (3)

Frage von Protected zum Thema C und C ...

Microsoft Office
gelöst Wie kann man die Standard-Schriftart bei einfügen von Text in Word 2013 festlegen? (3)

Frage von Rene1976 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...