Teil des Datienames Umformen
Hallo allerseits,
Meine batch Kenntnisse sind nicht besonders, versuche jedoch alles allein zu machen und mich so weiter zu entwickeln.
Ich möchte Dateien in einem rutsch umbenennen, die in das Suchmuster passen,
jedoch nur ein Teil des Dateinames soll verändert werden.
Nur das Datum soll umgeformt werden, anstatt _ soll ein . rein.
ich_bin_12_07_2014_eine_datei.txt zu ich_bin_12.07.2014_eine_datei.txt
eine_12_07_2014_weitere_datei.txt zu eine_12.07.2014_weitere_datei.txt
usw. usf.
Bis jetzt habe ich das Umbenennen so gemacht (sehe Code), das ersetzt alle definierte Zeichen.
Wie kann ich es nur auf das Datum eingrenzt, bzw. nur auf Zahlen?
Mein Code
Ich könnte das so machen:
set "neudatei=!datei:_01=.01!"
set "neudatei=!datei:_02=.02!"
usw. usf.
aber dann werden nicht alle Zahlen ersetzt und eine weitere Schleife wäre wohl nötig?
Eine universale Lösung wäre mir da lieber.
Da wird es doch eine einfachere Vorgehensweise geben??
Meine batch Kenntnisse sind nicht besonders, versuche jedoch alles allein zu machen und mich so weiter zu entwickeln.
Ich möchte Dateien in einem rutsch umbenennen, die in das Suchmuster passen,
jedoch nur ein Teil des Dateinames soll verändert werden.
Nur das Datum soll umgeformt werden, anstatt _ soll ein . rein.
ich_bin_12_07_2014_eine_datei.txt zu ich_bin_12.07.2014_eine_datei.txt
eine_12_07_2014_weitere_datei.txt zu eine_12.07.2014_weitere_datei.txt
usw. usf.
Bis jetzt habe ich das Umbenennen so gemacht (sehe Code), das ersetzt alle definierte Zeichen.
Wie kann ich es nur auf das Datum eingrenzt, bzw. nur auf Zahlen?
Mein Code
@echo off &setlocal
echo.>ich_bin_12_07_2014_eine_datei.txt
:: zu ich_bin_12.07.2014_eine_datei.txt
echo.>eine_12_07_2014_weitere_datei.txt
:: zu eine_12.07.2014_weitere_datei.txt
for /f "delims=" %%i in ('dir /b /a-d *.txt^| findstr /rbc:".*[0-9][0-9]_[0-9][0-9]_[0-9][0-9][0-9][0-9].*"') do (
set "datei=%%~i"
setlocal enabledelayedexpansion
echo !datei!
set "neudatei=!datei:_=.!"
echo ren "!datei!" -^> "!neudatei!"
echo.
ren "!datei!" "!neudatei!"
endlocal
)
set "neudatei=!datei:_01=.01!"
set "neudatei=!datei:_02=.02!"
usw. usf.
aber dann werden nicht alle Zahlen ersetzt und eine weitere Schleife wäre wohl nötig?
Eine universale Lösung wäre mir da lieber.
Da wird es doch eine einfachere Vorgehensweise geben??
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 243505
Url: https://administrator.de/contentid/243505
Ausgedruckt am: 17.11.2024 um 15:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo batchnewbie,
es gibt standardmäßig keinen Batchbefehl, der eine Ersetzung per "Regulärem Ausdruck" vornehmen kann (so wie es colinardo mit der PS vorgeturnt hat). Also wird's schwierig und du musst Alternativen finden. Ist ausgeschlossen, dass vor dem Datum bereits irgendwelche Zahlen im Dateinamen vorkommen?
BTW: Es gibt hervorragende Programme, die genau für das Umbenennen von Fotos entwickelt wurden.
Grüße
rubberman
es gibt standardmäßig keinen Batchbefehl, der eine Ersetzung per "Regulärem Ausdruck" vornehmen kann (so wie es colinardo mit der PS vorgeturnt hat). Also wird's schwierig und du musst Alternativen finden. Ist ausgeschlossen, dass vor dem Datum bereits irgendwelche Zahlen im Dateinamen vorkommen?
BTW: Es gibt hervorragende Programme, die genau für das Umbenennen von Fotos entwickelt wurden.
Grüße
rubberman
Na gut. Ich kitzle ja auch ganz gerne das Letzte aus Batch raus...
Teste
Ich hoffe die Kommentare helfen um zu verstehen. Die Zeichen / und ? verwende ich übrigens, weil sie nicht in einem Dateiname vorkommen können.
Grüße
rubberman
Teste
@echo off &setlocal
for /f "delims=" %%i in ('dir /b /a-d *.txt ^| findstr /rc:".*[0-3][0-9]_[01][0-9]_20[0-9][0-9].*"') do (
set "fOld=%%~i"
set "fNew=%%~i"
setlocal EnableDelayedExpansion
set "length1=0"
REM alle Zahlen durch / ersetzen
for %%j in (1 2 3 4 5 6 7 8 9 0) do set "fNew=!fNew:%%j=/!"
REM Dateiname an der Zeichenfolge //_//_//// splitten
for /f "delims=?" %%j in ("!fNew://_//_////=?!") do set "fNew=X%%j"
REM Länge des 1. Teilstrings berechen
REM http://www.dostips.com/DtCodeCmdLib.php#Function.strLen
for /l %%j in (12 -1 0) do (
set /a "length1 |= 1 << %%j"
for %%k in (!length1!) do if "!fNew:~%%k,1!"=="" set /a "length1 &= ~1 << %%j"
)
REM Teilstring mit dem Datum extrahieren
for %%j in (!length1!) do set "fNew=!fOld:~%%j,10!"
REM in diesem Teilstring die Unterstriche durch Punkte ersetzen
set "fNew=!fNew:_=.!"
REM Länge bis zum ersten Zeichen nach dem Datum
set /a "length2 = length1 + 10"
REM Dateiname neu zusammensetzen
for /f "tokens=1,2" %%j in ("!length1! !length2!") do set "fNew=!fOld:~,%%j!!fNew!!fOld:~%%k!"
REM das ECHO und ggf. PAUSE entfernen, wenn du sicher bist dass die Ersetzung vernünftig funktioniert
ECHO ren "!fOld!" "!fNew!"
endlocal
)
PAUSE
Grüße
rubberman
Hallo Endoro,
das erste was mir eingefallen ist, war von vorn tokenweise abzuschneiden und jedes mal mit findstr /b zu prüfen, ob das Datum vorn gelandet ist. Dann rufst du aber zig mal findstr als externes Tool auf, was am Ende eine Ewigkeit dauert und (wer weiß wie die Dateinamen tatsächlich aussehen) mehrfache konsekutive Unterstriche bekommst du dann auch nicht mehr vernünftig gehandhabt.
So ist wenigstens alles was nötig ist CMD-intern. Für die Ersetzung habe ich keine Alternative gefunden. Aber wenn dir noch 'ne andere Methode einfällt, kannst ja noch mal schreiben.
Grüße
rubberman
das erste was mir eingefallen ist, war von vorn tokenweise abzuschneiden und jedes mal mit findstr /b zu prüfen, ob das Datum vorn gelandet ist. Dann rufst du aber zig mal findstr als externes Tool auf, was am Ende eine Ewigkeit dauert und (wer weiß wie die Dateinamen tatsächlich aussehen) mehrfache konsekutive Unterstriche bekommst du dann auch nicht mehr vernünftig gehandhabt.
So ist wenigstens alles was nötig ist CMD-intern. Für die Ersetzung habe ich keine Alternative gefunden. Aber wenn dir noch 'ne andere Methode einfällt, kannst ja noch mal schreiben.
Grüße
rubberman