batchnewbie
Goto Top

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
@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
)
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? face-surprise
Eine universale Lösung wäre mir da lieber.

Da wird es doch eine einfachere Vorgehensweise geben??

Content-ID: 243505

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

Ausgedruckt am: 17.11.2024 um 15:11 Uhr

rubberman
rubberman 12.07.2014 um 16:46:38 Uhr
Goto Top
Hallo batchnewbie, willkommen im Forum.

Etwas mehr Input bitte. Du hast ja sicher nur Beispielnamen gepostet. Wie sieht das in der Realität aus? Ist die Anzahl Unterstriche vor dem Datum immer konstant? Oder ist die Länge des Dateinamens vor dem Datum immer konstant?

Grüße
rubberman
colinardo
colinardo 12.07.2014 aktualisiert um 17:55:25 Uhr
Goto Top
Moin,
falls du dich mal mit Powershell versuchen willst face-wink
dir 'C:\Ordner\*.txt' | ?{$_.Basename -match '\d{1,2}_\d{1,2}_\d{4}'} | rename-item -NewName {$_.Name -replace '(\d{1,2})_(\d{1,2})_(\d{4})','$1.$2.$3'}  
Grüße Uwe
batchnewbie
batchnewbie 12.07.2014 um 17:48:17 Uhr
Goto Top
@rubberman
Also, es sind jpg Bilder und die Dateinamen sind leider unterschiedlich lang vorn und hinter dem Datum, sonst hätte ich es schon per Tokens gelöst und vermutlich wird es auch nicht anders gehen, je nach der Vorn-Zeichenlänge werde ich es wohl dann zwei, drei Schleifen sein und dem dazugehörten Toknes.

@colinardo
Danke für den Powershell Code, bis jetzt habe ich mich noch nicht wirklich mit Powershell beschäftigt, die Kenntnisse sind da noch schlechter als mit Batch.
rubberman
rubberman 12.07.2014 um 18:43:55 Uhr
Goto Top
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
batchnewbie
batchnewbie 12.07.2014 um 20:13:53 Uhr
Goto Top
Ja die Nummerierung ist Vorn 001_, 002_ usw. usf. hab ich ganz vergessen, da ich mich zu sehr auf das Datum konzentriert hatte.

Ja es geht viele Programme die das wohl mit Leichtigkeit schaffen, für mich ist das nur etwas Übung face-smile
rubberman
Lösung rubberman 12.07.2014, aktualisiert am 13.07.2014 um 10:55:49 Uhr
Goto Top
Na gut. Ich kitzle ja auch ganz gerne das Letzte aus Batch raus...

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
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
Endoro
Endoro 13.07.2014 um 07:13:40 Uhr
Goto Top
Hey rubberman,
Es müsste auch ohne die Ersetzungen gehen. Kanns leider grad nicht testen.
Gruss, Endoro
batchnewbie
batchnewbie 13.07.2014 aktualisiert um 10:59:14 Uhr
Goto Top
Hi,
da fällt mir außer eine große WOW nichts ein, vielen Danke, funktioniert wie es soll.

Ich habe selber noch versuche per:
set "datei=!datei:01_=01.!"  
set "datei=!datei:02_=02.!"  
set "datei=!datei:_14_=_14.!"  
:: usw. usf.
ren "%%i" "!datei!"  
jedoch funktioniert das bei mir nicht wirtlich, da die Nummerierung Vorn auch umbenannt wird.
rubberman
rubberman 13.07.2014 um 12:09:48 Uhr
Goto Top
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
Endoro
Endoro 17.07.2014 um 21:16:51 Uhr
Goto Top
Hallo rubberman, ich war mit meinen Gedanken in der bash-Welt und du hast recht face-smile
Gruss, Endoro.
rubberman
rubberman 17.07.2014 um 23:37:10 Uhr
Goto Top
Ah, OK. Ich dachte ich könnte wieder was dazu lernen face-wink

Grüße
rubberman