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:
Alles was funktioniert soll mir recht sein! solange ich kein zusätzliches Programm benötige und ich es unter Windows ausführen kann.
Beispiele:
Soll werden zu:
Ich würde mich sehr über eure Hilfe freuen! Ich komme einfach nicht weiter....
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....
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 620580
Url: https://administrator.de/contentid/620580
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
16 Kommentare
Neuester Kommentar
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
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
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 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
@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}"
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!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...
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
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 . 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.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
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.
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
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.
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.
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 . Hatte ich erst mal ausgeklammert ist aber kein Problem ist jetzt oben auch berücksichtigt, mit solchen Files macht er jetzt erst mal nichts.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"
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 .