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

Dateiname einer Datei um Wert aus einerCSV-Datei per Batch erweitern

Frage Entwicklung Batch & Shell

Mitglied: Mikro110

Mikro110 (Level 1) - Jetzt verbinden

09.01.2013 um 10:32 Uhr, 2582 Aufrufe, 13 Kommentare

Hallo an die Administratorenrunde. Ich benötige mal wieder eure Hilfe bei einer etwas kniffligen Angelegenheit. Leider habe ich im Netz bis jetzt keine Lösung gefunden.

Ich habe in einem Verzeichnis mehrere Dateien. Diese sind immer wie folgt aufgebaut:

Datei(1).MP3
Datei(1).CSV
Datei(2).MP3
Datei(2).CSV
Datei(3).MP3
Datei(3).CSV

Diese Dateien werden so beim Abspeichern von Audioaufzeichungen angelegt, wobei in den CSV-Datein immer die Verwaltungsdaten zum gleichnamigen Audiofile vorhanden sind.

Ich müßte nun die Dateinamen um einen Wert aus der entsprechenden CSV-Datei erweitern. Dieser steht immer in der der 2. Zeile der CSV-Datei als erster Wert (also vor dem ersten Komma).

Da es sich bei diesen Dateien durchaus um bis zu 100 Audioaufzeichnungen handelt, kann dieses schlecht von Hand erfolgen. Deshalb möchte ich dieses gerne über eine Batch-Datei realisieren.

Der Dateiordner, in dem die Dateien liegen, ist stehts ein anderer. Nach der Umbenennung sollten die Dateien wie folgt aussehen:

Datei_WertausCSV.PM3
Datei_WertausCSV.CSV
...


Ich hoffe, dass jemand dafür eine gute Idee hat.
Mitglied: andimue
09.01.2013, aktualisiert um 12:45 Uhr
Hallo mikro110,

kannst du vielleicht mal den Inhalt einer csv-Datei posten?
Poste doch auch mal deinen Code, mit dem du es bisher versucht hast.

Oder willst du eine fertige Lösung haben (ich denke, du willst ja auch was lernen dabei oder )

Gruß Andi
Bitte warten ..
Mitglied: Mikro110
09.01.2013 um 13:27 Uhr
Die CSV-Dateien schauen alle wie folgt aus (hinter XXX stehen andere Daten, die ich aber nicht veröffentlichen darf):

Startzeitpunkt,Endzeitpunkt,Dauer,Agent,Kanal,Eigene Telefonnummer,Partner-Telefonnummer,Weitere Telefonnummer,Kommentar,
09.Jan 2013 12:57:07,09.Jan 2013 12:57:45,00:00:38,XXX,XXX,XXX,XXX,,Unbekannt,

Mir geht es bei dieser Datei um den Eintrag "09.Jan 2013 12:57:07", wobei diese vermutlich so in einem Dateinamen nicht mal zulässig sind. Hier sollte dann "09Jan2013_125707" stehen, falls das möglich ist.

Einen Code habe ich noch nicht, da ich auf diesem Gebiet blutiger Anfänger bin. Gerne bin ich aber bereit zu lernen, da ich mich damit beruflich auseinandersetzen muss und grundsätzlich neugierig bin.

Also auch Ansätze dafür nehme ich gerne auf.
Bitte warten ..
Mitglied: andimue
09.01.2013, aktualisiert um 15:15 Uhr
Blutigen Anfängern, die bereit sind zu lernen muss natürlich geholfen werden

01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
set "dirpath=d:\temp" 
04.
set "fileext1=csv" 
05.
set "fileext2=mp3" 
06.
set "filenameext=" 
07.
 
08.
for /f %%a in ('dir /b %dirpath%\*.%fileext1%') do call :umbenennen %%a 
09.
goto :EOF 
10.
 
11.
:umbenennen  
12.
for /f "delims=," %%b in ('more +1  %dirpath%\%1') do ( 
13.
		 
14.
		set "filenameext=%%b" 
15.
		set "filenameext=!filenameext: =_!" 
16.
		set "filenameext=!filenameext:.=_!" 
17.
		set "filenameext=!filenameext::=!" 
18.
	echo. 
19.
	echo    rename %dirpath%\%~n1.%fileext1% %~n1_!filenameext!.%fileext1% 
20.
	echo    rename %dirpath%\%~n1.%fileext2% %~n1_!filenameext!.%fileext2% 
21.
22.
goto :eof
zur Erklärung:

Zeile 03: Variable, die den Pfad zu den Dateien enthält
Zeile 04: Variable, die die erste zu bearbeitende Dateiende csv enthält
Zeile 05: Variable, die die zweite zu bearbeitende Dateiende csv enthält
Zeile 06: Variable, die den neu zu bildenden Dateinamenszusatz enthalten wird

Zeile 08: Schleife über die alle csv-Dateien im Pfad und mit jeder Datei eine Unterprozeudr aufrufen

Zeile 12: Zeile 2 (more +1) der übergebenden csv-Datei ausgeben und daraus den Wert vor dem ersten Komma entnehmen (deshalb der for-Befehl mit dem Zeichentrenner "delims=,")

Zeile 15: im Datum/Uhrzeitstring Blank durch _ ersetzen
Zeile 16: im Datum/Uhrzeitstring . durch _ ersetzen
Zeile 17: im Datum/Uhrzeitstring : entfernen

Zeile 19: umbennenen der csv-Datei
Zeile 20: umbennenen der mp3-Datei

Momentan ist das Umbennenen in Zeilen 19 + 20 durch den vorangestellten echo-Befehl noch deaktiviert, es wird nur der auszuführende Befehl ausgegeben.

Also mal die Zeile 3 anpassen und laufenlassen. Wenn alles paßt: den echo in Zeile 19 + 20 raus.

Es geht bestimmt noch eleganter, aber so funktioniert es jedenfalls erstmal

noch ein Hinweis: um das Skript kurz zu halten sind momentan keinerlei Prüfungen drin, also z.B. ob zu einer csv-Datei auch eine mp3 vorhanden ist oder wenn das Skript 2 mal läuft würde der Dateiname 2 mal um Datum/Uhrzeit ergänzt.

Gruß Andi
Bitte warten ..
Mitglied: bastla
09.01.2013 um 17:45 Uhr
@ andimue
"delayedExpansion" ist gar nicht nötig - Du kannst ja nur den Timestamp in der Schleife holen und den Rest außerhalb erledigen - in einer Fassung, die auch mehr als 2 Zeilen in der csv-Datei und Dateinamen/Pfade mit Leerzeichen verträgt (und falls im Originaldateinamen kein "_" vorkommt, auch gleich das Mehrfach-Umbenennen verhindert) etwa so:
01.
@echo off & setlocal 
02.
 
03.
set "dirpath=d:\temp" 
04.
set "fileext1=csv" 
05.
 
06.
for /f "delims=" %%a in ('dir /b "%dirpath%\*.%fileext1%"') do call :umbenennen "%%a" 
07.
goto :eof 
08.
 
09.
:umbenennen 
10.
echo %1|findstr "_">nul && goto :eof 
11.
 
12.
set "filenameext=" 
13.
for /f "delims=," %%b in ('more +1  "%dirpath%\%~1"') do if not defined filenameext set "filenameext=%%b" 
14.
if not defined filenameext goto :eof 
15.
set "filenameext=%filenameext: =_%" 
16.
set "filenameext=%filenameext:.=_%" 
17.
set "filenameext=%filenameext::=%" 
18.
 
19.
echo ren "%dirpath%\%~n1.*" "%~n1_%filenameext%.*" 
20.
goto :eof
Um nicht %dirpath% mitschleppen zu müssen, könntest Du vorweg
pushd "%dirpath%"
und nach der ersten Schleife das zugehörige
popd
verwenden.

Grüße
bastla
Bitte warten ..
Mitglied: andimue
10.01.2013 um 07:49 Uhr
@ bastla
Ich bin dir für deine konstruktiven Vorschläge wirklich dankbar. Das du beim Imbennenen mit .* arbeitest und so nicht die %fileext2% brauchst find ich gut. Auch die Idee, in der 2.Schleife nur das Datum/Uhrzeit rauszuziehen und so auf den "delayedExpansion" zu verzichten macht die Sache einfacher und durchschaubarer.
Der Befehl echo %1|findstr "_">nul && goto :eof ist auch ne gute Sache um ein doppeltes Umbennenen zu verhindern (ich hatte ja wie geschrieben keine Prüfungen reingebaut, um Mikro110 nicht zu sehr zu verwirren).
Die Ergänzung um den "if not defined" in der 2.for-Schleife ist gut und sinnvoll. Ich bin laut der Beschreibung davon ausgegangen, dass die csv-Datei nur 2 Zeilen hat. Aber so ist es auf jeden Fall sicherer.
Zu pushd und popd: die beiden Befehle hab ich irgendwie so garnicht auf dem "Schirm" wenn ich Prozeduren schreibe. Aber ich sollte sie wohl dringend in mein Repertoire aufnehmen
Freundliche Grüße
Andi
Bitte warten ..
Mitglied: Mikro110
10.01.2013 um 09:36 Uhr
Vielen Dank für die schnelle Hilfe.

@andimue
Grundsätzlich funktioniert das Umbenennen super. Nur wenn, wie in meinem Beispiel oben gezeigt, die Datei eine automatische Erweiterung "(1)" bekommen hat, dann funktioniert das Umbenennen leider nicht.
Mit der Batch von bastla funktioniert es hier hingegen aber auch. Kannst du bzw. bastla mir erklären wo hier der Unterschied liegt?

Zudem möchte ich die Erweiterung "(1)" usw. ebenfalls gleich entfernen. Gibt es dort einen Platzhalter für die Zahlen zwischen den Klammern? Ich hatte mir vorgestellt, dass ich dieses mit

set "filenameext=%filenameext: =%"

verwirklichen kann. Nur fehlt mir der Wert für die Klammern und Zahlenwert dazwischen, der durchaus dreistellig werden kann.
Bitte warten ..
Mitglied: andimue
10.01.2013 um 10:50 Uhr
Hi Mikro110,

bastlas Prozedur funktioniert deshalb, weil er deutlich sauberer programmiert als ich
Er hat überall, wo der Dateiname vorkommt diesen in "" eingeschlossen, also z.B. hier:
01.
for /f "delims=" %%a in ('dir /b "%dirpath%\*.%fileext1%"') do call :umbenennen "%%a" 
Er muss diese "" aber in der Unterprozeudr wieder entfernen und das macht er, indem er beim 2.for-Befehl diese Schreibweise nimmt: "%dirpath%\%~1" <-- hier kommt es auf die ~ an:

%~1 - Expandiert %1 und entfernt umschließende
Anführungszeichen (")

Erklärt wird dies in der Hilfe zum Befehl call ( also call /? am Prompt eingeben)

Für das Entfernen des Klammerteils aus dem Dateinamen kannst du z.B. den 2.for wie folgt abändern:
01.
for /f "tokens=1,3 delims=()" %%a in ("%~n1_%filenameext%") do ren "%dirpath%\%~n1.*" "%%a%%b.*"
Bitte warten ..
Mitglied: Mikro110
10.01.2013 um 12:57 Uhr
Hallo andimue,

danke für die Erklärung. Jetzt habe selbst ich das verstanden.

Ich habe nun für das Entfernen der Klammern inklusive Inhalt die 2. for-Zeile wie oben beschrieben geändert. Dann funktioniert die Umbenennung mit den Werten aus der CSV-Datei nicht mehr und es wird auch nur z.B. die (1) entfernt. Die restlichen Dateien (2), (3) ... bleiben unverändert.
Bitte warten ..
Mitglied: andimue
10.01.2013 um 14:23 Uhr
Sorry,
mein Fehler

Es muss nicht die 2.for-Schleife geändert werden sondern der ren-Befehl muss in eine for-Schleife eingebettet werden. Hier nochmals die Lösung von bastla mit der notwendigen Änderung

01.
@echo off & setlocal 
02.
 
03.
set "dirpath=d:\temp" 
04.
set "fileext1=csv" 
05.
 
06.
for /f "delims=" %%a in ('dir /b "%dirpath%\*.%fileext1%"') do call :umbenennen "%%a" 
07.
goto :eof 
08.
 
09.
:umbenennen 
10.
echo %1|findstr "_">nul && goto :eof 
11.
 
12.
set "filenameext=" 
13.
for /f "delims=," %%b in ('more +1  "%dirpath%\%~1"') do if not defined filenameext set "filenameext=%%b" 
14.
if not defined filenameext goto :eof 
15.
set "filenameext=%filenameext: =_%" 
16.
set "filenameext=%filenameext:.=_%" 
17.
set "filenameext=%filenameext::=%" 
18.
 
19.
for /f "tokens=1,3 delims=()" %%a in ("%~n1_%filenameext%") do echo ren "%dirpath%\%~n1.*" "%%a%%b.*" 
20.
goto :eof
Bitte warten ..
Mitglied: Mikro110
11.01.2013 um 07:17 Uhr
Moin andimue,

grundsätzlich scheint die Prozedur zu klappen. Es werden die Dateien leider nur nicht mehr umbenannt. Den Grund kann ich leider nicht sagen. Ich habe bis jetzt folgendes versucht:

1. Batch neu aus deinem obigen Eintrag kopiert
2. Rechner runtergefahren, stromlos gemacht und danach neu gestartet
3. Batch erneut eingerichtet
4. Pause-Befehl eingefügt vor letztem "goto :eof"

Durch den Pause-Befel konnte ich im CMD-Fenster folgendes sehen:

ren "d:\test\Test1(1).*" "Test1_09_Jan_2013_125707.*"

Dieses dann auch nochmal für die beiden 2. Testdateien Test1(2).

Führe ich den gleichen Befehlssatz mauell im CMD aus, so werden die Dateien auch richtig umbenannt. der Unterschied ist in der Darstellung nur, dass ich davor noch die üblichen C:\Users\Internet> stehen habe.

Hast du eine Idee, woran das liegen kann, dass der Befehlssatz manuell funktioniert, aber über den Batch nicht?
Bitte warten ..
Mitglied: bastla
11.01.2013 um 07:25 Uhr
Hallo Mikro110!

Das "echo" in der Zeile 19 hast Du schon entfernt (zum Testen wird dadurch der "ren"-Befehl nur angezeigt)?

Grüße
bastla
Bitte warten ..
Mitglied: Mikro110
11.01.2013 um 07:43 Uhr
Hallo Bastla,

dieses Echo habe ich total übersehen. Ich hatte nur auf den Beginn der jeweiligen Zeile geachtet.

Vielen Dank an euch beide. Es funktioniert super und ich habe wiede ne Menge dazugelernt.
Bitte warten ..
Mitglied: andimue
11.01.2013 um 11:27 Uhr
Servus Mikro110,

Tschuldigung für die Verwirrung, die ich bei dir verursacht habe aber ich hab nur den rename-Befehl von bastla (mit echo) genommen und neu verpackt.
Aber wenn nun alles funktioniert ist es ja gut.

Grüße auch an bastla für seinen Input

Andi
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
Neuere Datei per Batch ausfinding machen (2)

Frage von chattie zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...