berndschroed
Goto Top

Dateinamen per Batch Umbennenen (alles hinter 4 stelliger Zahl entfernen)?

Ich habe eine größere Menge Datein in unterschiedlichen Dateiformaten. Jede Datei hat im Dateinamen eine Jahresangabe (ein paar wenige auch zwei). Ich würde gerne den String, also die vierstellige Zahl VON RECHTS suchen und alles inklusive der gesuchten Zahl bis zur Dateiendung entfernen. Letztere muss natürlich bleiben.

Darüber hinaus sollen sämtliche Punkte im Dateinamen (außer der Punkt für die Dateiendung) in Leerzeichen umgewandelt werden. Dafür habe ich bereits einen funktionierenden Code:

@echo off&setlocal

for %%i in (*.*.*) do (
set "neu=%%~ni"  
for /f "delims=" %%j in ('call echo "%%neu:.= %%"') do ren "%%~i" "%%~j%%~xi"  
)

Alles was funktioniert soll mir recht sein! solange ich kein zusätzliches Programm benötige und ich es unter Windows ausführen kann.

Beispiele:
text.bla.text.26.irgendwas.8.text.vvfkwgvk.2019.noch.mehr.text.worte.jpg
zhfsovho.sfsvfv.tt.2625.ivfbd.fdb.vnzk.2019.das.hier.soll.alles.verschwinden.avi

Soll werden zu:
text bla text 26 irgendwas 8 text vvfkwgvk.jpg
zhfsovho sfsvfv tt 2625 ivfbd fdb vnzk.avi

Ich würde mich sehr über eure Hilfe freuen! Ich komme einfach nicht weiter....

Content-ID: 620580

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

ricardobohner
ricardobohner 08.11.2020 um 22:41:00 Uhr
Goto Top
Interessant so ein batch aber diesen teil have ich nicht so richtig verstandenface-sad'call echo "%%neu:.= %%"').
Was macht dieser call da drinnen?
berndschroed
berndschroed 08.11.2020 um 22:49:59 Uhr
Goto Top
Kann ich dir leider nicht beantworten. Ich habe den Code selber nur "ergoogelt". Er ersetzt zumindest zuverlässig alle Punkte, was schon mal schön ist.
berndschroed
berndschroed 08.11.2020 aktualisiert um 23:10:11 Uhr
Goto Top
Vielleicht hilft es auch wenn ich die gewünschte Logik erläutere mit der es (aus meiner Sicht) klappen könnte. Dann kann das ja ggf. einer in Code "umwandeln"

-Anzahl der Ziffern des Dateinamen auslesen und in Variable A speichern
-Wenn Abfrage: wenn aktuelles Zeichen (Variable A) ein Punkt ist Dann:
Dann aktuelle "Position" in Variable B übergeben.
Ansonsten A-1 und erneut Prüfen ob eine Zahl vorliegt.

-Wenn Abfrage: wenn aktuelles Zeichen (Variable B) eine Zahl ist Dann:
neue Wenn Abfrage: Wenn aktuelles Zeichen (Variable B) & aktuelles Zeichen (Variable B-1) & aktuelles Zeichen (Variable B-2) & aktuelles Zeichen (Variable B-3) eine Zahl ist Dann aktuelles Zeichen (Variable B-3) in Variable C übergeben.
Ansonsten B-1 und erneut Prüfen ob eine Zahl vorliegt.

-Anschließend alle Zeichen von Variable B bis Variable C entfernen. bzw neuen Dateinamen aus Zeichen 0 bis Variable C-1 erstellen.
-Zuletzt den oben angegebenen Code ausführen um alle Punkte zu entfernen

-ERFOLG face-big-smile
Doskias
Doskias 08.11.2020 um 23:10:56 Uhr
Goto Top
Moin,

Wie willst du denn die Lösung warten/weiterentwickeln wenn du nicht verstehst was du da tust? das Forum sit dafür da, dir zu helefn und Tipps zu geben, nicht deinen Job für dich zu erledigen. ich würds mit Powershell machen, was vermutlich nicht mehr als 5 oder 6 Zeilen sind. Aber da du dich selbst nicht damit ebschäftigst und nur Google Ergebnisse hier einstellst ohne zu verstehen was da passiert, fehlt mir die Motivation das für dich zu erledigen.

Gruß
Doskias
ricardobohner
ricardobohner 09.11.2020 um 00:09:18 Uhr
Goto Top
Das ist ja schwirieger wie ich dachte in batch zu machen. Das eigentliche datum soll auch verschwinden? Wei weit variiren die datums den so 1920-2020?
Doskias
Doskias 09.11.2020 um 07:46:15 Uhr
Goto Top
Zitat von @ricardobohner:

Das ist ja schwirieger wie ich dachte in batch zu machen. Das eigentliche datum soll auch verschwinden? Wei weit variiren die datums den so 1920-2020?

Das ist ja ein gruseliger Beitrag von dir, dabei ist Halloween doch schon vorbei. Also:

1. sechs Rechtschreibfehler in einer einzeiligen Antwort. Dein Ernst?
2. Merke dir bitte: Gleichheiten immer mit wie, Ungleichheiten immer mit als. Es heißt also "schwieriger als"

So. nachdem mein innerlicher Ausbilder seinen Ausbruch nun überwunden hat zurück zum Thema:

Es ist ja auch durchaus denkbar, dass noch weitere Dateien in der Zukunft erstellt werden. Rein theoretisch ist es auch denkbar, dass eine Zahl nicht der Jahreszahl entspricht sondern nur "zufällig" im Dateinamen auftaucht. Im Beispiel steht ja auch 2625. Das kann theoretisch ja auch ein Datum sein. Es entspricht zumindest den oben genannten Kriterien. anstatt 2625 könnte da ja auch 2025 stehen, und schon wären wir wieder bei einem möglichem Datum.

Gruß
Doskias
146189
Lösung 146189 09.11.2020 aktualisiert um 10:22:55 Uhr
Goto Top
@echo off
set "ordner=d:\daten"  
Powershell -EP ByPass -C "ls '%ordner%' -File | ?{$_.Basename -match '(^.*)\d{4}'} | %%{ ren $_.FullName -NewName ($matches[1].replace('.',' ').trim() + $_.Extension) -verbose -Force}"  
ricardobohner
ricardobohner 09.11.2020 um 09:24:15 Uhr
Goto Top
Dieser Powershell & Batch Hybride hat für mich funktioniert um die Sequenz von 4 Nummern und alles was danach kommt zu entfernen aber nicht um die Punkte zu entfernen...
146189
146189 09.11.2020 aktualisiert um 09:36:56 Uhr
Goto Top
Zitat von @ricardobohner:

Dieser Powershell & Batch Hybride hat für mich funktioniert um die Sequenz von 4 Nummern und alles was danach kommt zu entfernen aber nicht um die Punkte zu entfernen...
Erzähl doch keinen Müll ... Sicher entfernt der die Punkte, schau dir den Code doch einfach mal genau an dann siehst du das dieser diesen Schritt ebenfalls vornimmt, funktioniert, hier einwandfrei getestet!

screenshot
ricardobohner
ricardobohner 09.11.2020 um 10:07:39 Uhr
Goto Top
Ja wenn man ein pause eingibt sieht man zwar das er die dateien richtig umbennen wird (ohne punkte) macht es aber in der praktis aber nicht: GIF
146189
146189 09.11.2020 aktualisiert um 10:39:11 Uhr
Goto Top
Zitat von @ricardobohner:

Ja wenn man ein pause eingibt sieht man zwar das er die dateien richtig umbennen wird (ohne punkte) macht es aber in der praktis aber nicht: GIF
Doch siehst du doch das es sie umbenannt hat face-wink. Es werden natürlich nur die Dateien in das passende Format umbenannt welche auf das Format passen bzw. eine Zahl mit 4 Stellen im Dateinamen haben, andere Dateien die keine vierstellige Zahl im Namen haben werden auch nicht verändert, dazu hat der TO ja nichts gesagt! Was im Skript als Verbose steht wird auch tatsächlich gemacht, und wenn dort auch keine Fehlermeldung steht wurde die Datei auch umbenannt! Wie ich schon sagte, schau dir den Code mal ganz genau an dann verstehst du auch wie er arbeitet. Ich habe mich dabei strikt an seine Vorgaben in seinem Original-Post gehalten nicht mehr und nicht weniger.
ricardobohner
ricardobohner 09.11.2020 um 12:05:19 Uhr
Goto Top
Alles klar dann. Ich dachte halt er würde die Punkte von allen Dateien entfernen nicht nur die, die eine Vierstellige zahl haben.. Leider kann ich den code nicht so gut interpretieren da ich nur sehr wenig von powershell verstehe ich habe da versucht was mit batch zu machen.. aber bis jetzt ohne erfolg.
146189
Lösung 146189 09.11.2020 aktualisiert um 17:45:14 Uhr
Goto Top
Reines Batch geht natürlich auch, aber mal ehrlich, warum sollte man sich heutzutage noch ernsthaft für so eine Pippifax-Aufgabe einen mit 80er-Batch abbrechen?? Dafür tut es auch jedes halbwegs vernünftige frei verfügbare Rename-Programm das Regular Expressions beherrscht, z.B. https://www.advancedrenamer.com/.
@echo off &setlocal ENABLEDELAYEDEXPANSION
set "ordner=d:\daten"  
for %%a in ("%ordner%\*.*") do (  
	set "basename=%%~na"  
	call :strLength strLen "!basename!"  
	set /a strLen-=4
	set "pos="  
	for /L %%b in (!strLen! -1 1) do (
		if not defined pos (
			echo.!basename:~%%b,4!|findstr /rc:"[0-9][0-9][0-9][0-9]" >nul 2>&1 && (  
				set "basename=!basename:~0,%%b!"  
				set "basename=!basename:.= !"  
				set pos=1
			)
		)
	)
	if defined pos (
		for /l %%a in (1,1,31) do if "!basename:~-1!"==" " set basename=!basename:~0,-1!  
		ren "%%a" "!basename!%%~xa"  
	)
)

goto :eof

:strLength
set "#=%~2"  
set length=0
:stringLengthLoop
if defined # (set #=%#:~1%&set /A length += 1&goto stringLengthLoop)
set "%~1=%length%"  
goto :eof
ricardobohner
ricardobohner 09.11.2020 um 17:30:07 Uhr
Goto Top
Danke für die Arbeit. Bei mir hat die batch datei folgendermassen funktioniert:

Voher:
Datei 1: 2020.Testando.88.testando.txt
Datei 2: Dicas para.9 pessoas.1999.txt
Datei 3: Mein880Lied 4 ist 473 bald444fertig33_2020abcdefghijklmnop.avi
Datei 4: Test 394.Ja gut 2018 ddkfjdljf.wurst.mp3

Nachher:
Datei 1: .=.txt
Datei 2: Dicas para 9 pessoas.txt
Datei 3: Mein880Lied 4 ist 473 bald444fertig33_.avi
Datei 4: Test 394 Ja gut.mp3

Also bei Datei 1 "Wenn die 4 Nummern am anfang sind gibt es anscheinend einen fehler. Und bei datei 4 hätte ich erwartet das da ein Lehrzeichen nach dem gut und for em punkt sein sollte "Test 394 Ja gut .mp3"
Sonst alles gut verlaufen.
146189
146189 09.11.2020 aktualisiert um 17:46:08 Uhr
Goto Top
Zitat von @ricardobohner:
Also bei Datei 1 "Wenn die 4 Nummern am anfang sind gibt es anscheinend einen fehler.
Joa wenn der Dateiname leer ist klar da muss er dann schon definieren was dann gemacht werden soll face-smile. Hatte ich erst mal ausgeklammert ist aber kein Problem ist jetzt oben auch berücksichtigt, mit solchen Files macht er jetzt erst mal nichts.
Und bei datei 4 hätte ich erwartet das da ein Lehrzeichen nach dem gut und for em punkt sein sollte "Test 394 Ja gut .mp3"
Das kannst du gerne so haben wenn du Zeile 18 weg lässt, welche überschüssigen Whitespace am Ende des Basename entfernt, das kommt nämlich generell bei den Anwendern eher ungut und führt oftmals zu Missverständnissen deswegen habe ich das Trimming am Ende mit eingefügt, ist also im Skript so gewollt face-smile.
berndschroed
berndschroed 10.11.2020 um 00:48:56 Uhr
Goto Top
Ich danke allen für die rege Beteiligung und die tolle Unterstützung! Hätte ich selber niemals hinbekommen. Mir fehlt einfach die Zeit mich da so intensiv einzulesen. VIELEN DANK!