Batch In Unterordnern Datei mit Namen des Ordners und Variablen-Inhalt erstellen

dabooster

Cadet 4th Year
Registriert
Apr. 2015
Beiträge
115
Hallo zusammen,

ich habe hier einen Task den ich mit einer Batch-Datei erledigen möchte, und ich bin mir sicher, dass das sogar recht easy mit einem FOR-Kommando zu erreichen ist.
Aber nachdem ich jetzt ein paar Stunden die Befehlszeilen-Referenz gelesen hab, und in meinem Testordner rumgespielt habe, ohne auch nur einen Hoffnungsschimmer zu bekommen, muss ich mir eingestehen dass ich diese FOR-Sache nicht blicke, und hoffe mir kann hier jemand für mein konkretes Anliegen fix weiterhelfen. Es ärgert mich zwar, weil ich weiß, bei der nächsten Aufgabe steh ich wieder dumm da - aber vielleicht versteh ich zumindest ein bisschen mehr, wenn ich die funktionierende Lösung für mein konkretes Anliegen hab, und das nachvollziehen kann ;-)


Ich habe Verzeichnis mit vielen Unterordnern, mit dem Schema"\Künstler - Album", also
\Beatles - Abbey Road\
\James Brown - Sex Machine\
\Flippers - Du bist mein Pudding\
\Justin Bieber - Highway to Hell\

In jedem Ordner soll eine Textdatei mit dem gleichen Ordnernamen erstellt werden ("\Künstler - Album\Künstler - Album.txt", also
\Beatles - Abbey Road\Beatles - Abbey Road.txt
\James Brown - Sex Machine\James Brown - Sex Machine.txt
\Flippers - Du bist mein Pudding\Flippers - Du bist mein Pudding.txt
\Justin Bieber - Highway to Hell\Justin Bieber - Highway to Hell.txt

Der Inhalt jeder Textdatei soll Künstler und Album enthalten. Dazu muss der Ordnername in zwei Variablen geteilt werden, als Trenner " - ". Beispiel "\Beatles - Abbey Road\Beatles - Abbey Road.txt":
<title>Beatles - Abbey Road</title>
<album>Abbey Road</album>
<artist>Beatles</artist>


Als Zutaten hab ich "FOR /D", "FOR /F" und "delim:-" ausgemacht. Aber egal wie ich damit koche, da kommt nix gescheites bei raus. Kann mir ein Zauberkünstler bei dem Task helfen?
Ergänzung ()

PS: Hoffentlich is das nicht komplett unverschämt - eigentlich bräucht ich sogar noch ne abgewandelte Version davon :-D Hier sind in einem Ordner ganz viele Dateien, und für die mit festgelegte Endungen soll ebenso eine gleichlautende Textdatei erstellt werden. Also z.b.
Beatles - Abbey Road.mp3
Beatles - Abbey Road.txt
<title>Beatles - Abbey Road</title>
<album>Abbey Road</album>
<artist>Beatles</artist>

Wär echt super wenn mir ein Batch-Profi hier helfen kann! :-)
 
Code:
@echo off 
Setlocal EnableDelayedExpansion

:: Schleife über alle Verzeichnisse unterhalb des aktuellen Verzeichnisses 
For /D /r %%a in (*) do (
	set pathName=%%~fa
	set dirName=%%~nxa
	set fileName=!pathname!\!dirName!.txt

	:: kommt in dirName " - " vor?
	set dirTemp=!dirName: - =!

	if !dirTemp! neq !dirName! (
		:: String zerlegen und in die Datei schreiben
		For /f "tokens=1,2" %%c in ("!dirName: - = !") do (
			set titleString=^<title^>!dirName!^</title^>
			set albumString=^<album^>%%d^</album^>
			set artistString=^<artist^>%%c^</artist^>
			echo !titleString! > !fileName!
			echo !albumString! >> !fileName!
			echo !artistString! >> !fileName!
		)
	)
	
)    
Endlocal

Für Deine zweite Variante müsstest Du die Schleife an statt über die Verzeichnisse über die mp3-Dateien laufen lassen ...

Code:
@echo off 
cls
Setlocal EnableDelayedExpansion

:: Schleife über alle mp3-Dateien im aktuellen Verzeichniss, die dem Namensformat entsprechen 
For /F "tokens=1,2 delims=." %%a in ('dir /B "* - *.mp3"') do (
	set titleName=%%~nxa
	set fileName=!titleName!.txt

	:: String zerlegen und in die Datei schreiben
	For /f "tokens=1,2" %%c in ("!titleName: - = !") do (
		set titleString=^<title^>!titleName!^</title^>
		set albumString=^<album^>%%d^</album^>
		set artistString=^<artist^>%%c^</artist^>
		echo !titleString! > !fileName!
		echo !albumString! >> !fileName!
		echo !artistString! >> !fileName!
	)
	
)    
Endlocal
 
Alter! Das ist der Wahnsinn!!!
Awesome. Ich wusste doch, is gar nich so schwer... ;-) :-D

Nein im Ernst, ganz großes Kino, danke dir!
Ausm Stand versteh ich die For-Schleife natürlich immer noch nicht :-p Aber setz mich heut Abend nochmal mit Ruhe dran... Ist schon echt Hilfreich das zu verstehen und einsetzen zu können.

Jedenfalls: Riesengroßen vielen Dank dir für deine tolle Hilfe!!!
Ergänzung ()

...okay, kannst du mir doch nochmal kurz helfen? ;-)

Zuerstmal, was ich geschafft habe:
- Umlaute korrekte darstellen (CHCP)
- Ausgabedatei zuerst als *.tmp speichern, danach rekursiv umbenennen zu *.txt (Dadurch wird verhindert dass ggf. vorhandene Dateien überschrieben werden)
- Mit Pushd und Popd das arbeiten auf einem UNC-Pfad ermöglichen


Aber woran es hängt: Der Trenner funktioniert nicht wie benötigt. Das Ergebnis in der Datei sieht dann so aus:
Code:
<title>Das Regenwetter - Ist wirklich nicht schön - Ungelogen</title> 
<album>Regenwetter</album> 
<artist>Das</artist>

Leider schnall ich genau die entscheidende Zeile nicht um da selbst mit rumzuspielen.
Code:
For /f "tokens=1,2" %%c in ("!dirName: - = !") do (
"Tokens=1,2" ist ja genau der Gedanke, nach dem (ersten) " - " zu trennen. Aber es wird nach dem Leerzeichen getrennt.

Wie schaff ichs, dass als Trenner zwischen Token1 und Token2 " - " verwendet wird?
 
dabooster schrieb:
Leider schnall ich genau die entscheidende Zeile nicht um da selbst mit rumzuspielen.
Code:
For /f "tokens=1,2" %%c in ("!dirName: - = !") do (
"Tokens=1,2" ist ja genau der Gedanke, nach dem (ersten) " - " zu trennen. Aber es wird nach dem Leerzeichen getrennt.

Wie schaff ichs, dass als Trenner zwischen Token1 und Token2 " - " verwendet wird?
Delimiter (Trennzeichen) können nur einzelne Zeichen sein. Deswegen ersetze ich mit "!dirName: - = !" jedes Auftreten von " - " durch ein Leerzeichen.

Zur Erklärung !dirName: - = ! ersetzt in !dirName! jedes Vorkommen von " - " (Wert hinter den Doppelpunkt) durch " " (Wert hinter dem "=").

Das Ergebnis passt natürlich nicht, wenn es mehrere " - " oder aber Leerzeichen im Albumnamen gibt. Bei Leerzeichen hilft schon das Verwenden eines anderen Trennzeichens, z.B. das Semikolon:

Code:
For /f "tokens=1,2 delims=;" %%c in ("!dirName: - =;!") do (

Das hilft aber nicht bei mehrerem " - ". Ist immer das erste " - " Trenner zwischen Artist und Titel? Dann könnte man mit findstr nach dem ersten Vorkommen suchen und nur dieses ersetzen - durch ein Trennzeichen welches ansonsten nicht vorkommt.
 
Ah perfekt! Jetzt hab ich die Zeile auch verstanden - zumindest am konkreten Beispiel ;-)

Ja, bis auf eine Ausnahme unter Tausenden ist immer vor dem ersten " - " der Artist. Ich habs jetzt Quick&Dirty gelöst:
Code:
For /f "tokens=1,2,3 delims=;" %%c in ("!dirName: - =;!") do (
set albumString=^<album^>%%d %%e^</album^>

Klappt reibungslos! Danke nochmal! :-)
 
Wenn Du nur das erste " - " durch ein Trennzeichen ersetzen willst, schau Dir den folgenden Code an:
Code:
	:: Erste Position von " - " suchen, suche bis Zeichen 50
	set "searchString= - "
	set foundString="false"
	for /L %%f in (0,1,50) do (
		set "subString=!dirName:~%%f!"
		if !foundString!=="false" (
			if "!searchString!!subString:~3!"=="!subString!" (
                                :: an der gefundenen Stelle den searchString durch Trenner ; ersetzen
				set titleTemp=!dirName:~0,%%f!;!subString:~3!
				set foundString="true"
			)
		)
	)

!titleTemp! kannst du anschließend an Stelle von !dirName: - =;! einsetzen
 
Zurück
Oben