evotoy
Goto Top

Dateinamen einlesen, auftrennen, umsortieren ... Datei umbenennen

Hi,

schöne Ostern erst mal an alle!!!

ich wollt mal wieder ne tolle batch schreiben aber ich scheiter schon im Ansatz!!! Ich hab hier schon alles durchforstet und auch einige Ansätze gefunden - so richtig bin ich damit aber nicht weiter gekommen ....

der Plan: Dateien in einem Ordner umbenennen - und zwar:

Dateiname0001.jpg in 01-Dateiname.jpg
Dateiname0002.jpg in 02-Dateiname.jpg

Dateiname_occlusion0001.jpg in 01-Dateiname-occlusion.jpg
Dateiname_occlusion0002.jpg in 02-Dateiname-occlusion.jpg

ich versuch's glaub ich wieder viel zu kompliziert anzugehen ... mit welchem Befehl geht das denn? geht das in einem Durchgang oder muss man das in mehrerern Schritten machen?

Content-Key: 139801

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

Printed on: April 20, 2024 at 01:04 o'clock

Member: AndreasBrecht
AndreasBrecht Apr 03, 2010 at 13:35:37 (UTC)
Goto Top
Set fso = CreateObject("Scripting.FilesystenObject")  
Set fldr = fso.GetFolder("DerPfad")  
For Each fl in fldr.files
  File.name = Mid(fl.Name, Len(fl.Name) - 6, 2) & Left(fl.Name, Len(fl.Name) - 8) & ".jpg"  
Next

Das Umbenennen müsste evtl angepasst werden, wenn nich alle jpg und/oder die Nummern nicht immer 4-stellig sind
Member: bastla
bastla Apr 03, 2010 at 14:37:58 (UTC)
Goto Top
Hallo evotoy!

Als Batch ungetestet etwa so (ebenfalls unter der Voraussetzung, dass die letzen 4 Stellen entfernt werden sollen):
@echo off & setlocal
set "Ordner=D:\Testordner"  
set "Maske=*.jpg"  

pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b %Maske%') do set "Name=%%~ni" & call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
echo ren %1 "%Name:~-2%%Name:~,-4%%~x1"  
Das "echo" in der Zeile 11 steht zum Testen da - so wird der Befehl zum Umbenennen nur angezeigt, aber noch nicht ausgeführt; wenn's vernünftig aussieht, einfach dieses "echo" entfernen ...

Grüße
bastla
Member: bastla
bastla Apr 03, 2010 at 14:43:05 (UTC)
Goto Top
@AndreasBrecht
wenn nich alle jpg
... lässt sich einfach über
... & "." & fso.GetExtensionName(fl.Name)
lösen (und "GetBaseName()" könntest Du dann auch gleich einbauen) ...

Grüße
bastla
Member: evotoy
evotoy Apr 03, 2010 at 14:53:27 (UTC)
Goto Top
Hi,

danke!!! ich kuck mir das später gleich mal an ... muss leider erst noch n paar Osteraktivitäten mitmachen face-sad ...

ich werd's denk ich erst mal mit der Batch probieren. Das VBS versuch ich dann auch mal wenn die batch geht
Member: AndreasBrecht
AndreasBrecht Apr 03, 2010 at 15:24:53 (UTC)
Goto Top
Hallo bastla,

Danke für den Tipp. Die beiden Funktionen habe ich schon immer vermisst. Ich hätte nur nicht gedacht, dass die Blinden von Microsoft, die dierekt unter dem Filesystemobjekt einsortiert haben.
Member: evotoy
evotoy Apr 03, 2010 at 17:56:41 (UTC)
Goto Top
so ... ich hab grad versucht den schnipsel auseinanderzuklamüsern - deshalb fehlen da auch ein paar Zeilen weiter unten. Ich fürchte ich werde mit den batch codes nicht warm ... ok ... ich versuch mal den code zu übersetzen. Vielleicht kann mir jemand behilflich sein ... ich würde es gerne verstehen!!

set "Maske=00??.*"

das ist klar soweit - quasi ne suchmaske um die dateien zu filtern, die umbenannt werden sollen.

for /f "delims=" %%i in ('dir /b %Maske%') do set "Name=%%~ni" & call :ProcessFile "%%i"

hätt ich so bestimmt erst nach nem Monat zusammen gehabt face-smile ... also ne Schleife, die für alle dateien in die variable "name" den dateinamen (%%~ni) schreibt und dann zu der sprungmarke hüpft, richtig?

echo ren %1 "%Name:~-2%%Name:~,-4%%~x1"

so ... hier wird's schwierig für mich ... ich find hier nicht mal den Anfang und das Ende ... ren kann ja nicht so viel. Das heißt, da müsste jetzt " ren 'nameALT' 'nameNEU' " drin stehen. Was macht denn die Zeile genau? Am besten Zeichen für Zeichen face-sad ... sorry!! ... könnte der code heißen: setzte den Namen zusammen aus den letzten zwei Zeichen des alten Namens und dem alten Namen ohne die letzten vier zeichen? welche % gehören denn dann wozu? und ist die "%1" der erste Dateiname im ren Befehl? müsste ja ... wieso steht dann da ne 1 und keine Zählvariable %i oder so was ...

danke!!
Member: bastla
bastla Apr 03, 2010 at 18:05:46 (UTC)
Goto Top
Hallo evotoy!
setzte den Namen zusammen aus den letzten zwei Zeichen des alten Namens und dem alten Namen ohne die letzten vier zeichen?
Genau das ist der Plan. face-smile

Etwas zerpflückt am Beispiel der Datei "Dateiname0001.jpg":

  • %1 ist der beim Aufruf übergebene komplette Dateiname "Dateiname0001.jpg" (das Unterprogramm ab ":ProcessFile" verhält sich in dieser Hinsicht wie eine weitere Batchdatei und übernimmt daher Aufrufparameter als %1, %2 etc)
  • %Name:~-2% liefert "01" (in der Variablen %Name% steht ja nur "Dateiname0001"),
  • %Name:~,-4% (könnte auch %Name:~0,-4% geschrieben werden) bildet den Teilstring ab Zeichen 1 (bzw beginnend nach dem "Zeichen Nr. 0") bis 4 Zeichen vor dem Ende, also "Dateiname0001", und
  • %~x1 steuert den Typ (samt Punkt davor) bei - demnach ".jpg"

Zur Teilstringbildung siehe set /? ...

Grüße
bastla
Member: evotoy
evotoy Apr 04, 2010 at 07:02:15 (UTC)
Goto Top
Hi,

vielen Dank bastla ... also das läuft jetzt und ich habs auch verstanden face-smile ... wenn man weiß, was man googeln muss findet man auch ne Menge ;)

ich hab mal versucht, meine letzte batch und die neue zusammen zu schmeißen. In der letzten wurden auch wieder ein Teil vom Namen abgesplittet und dann damit ein Ordner erstellt, in den die Dateien kopiert wurden. Das Script funktioniert so weit - es kommt also genau das raus, was rauskommen soll. Allerdings denke ich , dass das ziemlich unsauber ist. Ich hab auch schon andere Wege probiert. Die haben aber nicht geklappt, so dass ich nun bei der Version gelandet bin ...

1. kann man das in einer Batch elegant lösen? Ist der Ansatz mit den Sprungmarken ok oder ist der schrott?

2. ich hab da ziemlich viele Sprungarken drin - find ich ... ich hab auch gemerkt, dass das script extrem langsam geworden ist im Vergleich zu der Version ohne die Marken.
woher kommt das?

3. Hat das Script einen Fehler, den ich nicht verstehe. Nach dem Druchlaufen des Scripts hängt das Ding in ner Schleife fest wo gar keine ist ... Der Ausdruck "Sortiervorgang beendet" kommt einfach unendlich??????? so dass man das CMD Fenster schließen muss.

Das Ding ist, dass erst die Umbenennung laufen müsste und dann das verschieben - es sollen nämlich beim Verschieben auch Dateien berücksichtigt werden, die bereits die Namenskonvertierung haben. Hier mal der Code dazu

@echo off

echo __________________________________________
echo __________///  Umbenennen \\\_____________
echo __________________________________________

set {{comment_strings:41500927602}} 

:1
for /f {{comment_strings:42541603153}} %%i in ('dir /b %MaskRename%') do set {{comment_strings:6657828605}} & call :2 {{comment_strings:64224063958}}  

echo __________________________________________    
echo Umbenennen beendet.   
echo __________________________________________    
goto :3


:2
set name=%name:_occlusion=-occlusion%
ren %1 "%Name:~-2%-%Name:~,-4%%~x1"   
echo %1 {{comment_strings:32365003170}} 
goto :1

:3

echo __________________________________________
echo ___________///  Sortieren \\\_____________
echo __________________________________________

set "MaskSort=??-*.*"  

:5
for /F {{comment_strings:23759469791}} %%i in ({{comment_strings:14094549536}}) do set {{comment_strings:13762658272}} & call :4 "%%i"  

goto :6

:4
    if exist {{comment_strings:43115843065}} ( 
        move {{comment_strings:12963304718}} "%Name1:~3%\" 2>NUL  
	rem goto :5 
    ) ELSE (
        echo __________________________________________    
        echo              Erstelle Ordner   : %Name1:~3%   
        echo __________________________________________        

        md "%Name1:~3%" 2>NUL  
        move "%name1%%~x1" "%Name1:~3%\" 2>NUL  
	rem goto :5	
    )
goto :5

:6
echo __________________________________________    
echo Sortiervorgang beendet.    
echo __________________________________________  
goto :eof
pause

Danke und vg,
Member: bastla
bastla Apr 04, 2010 at 09:04:38 (UTC)
Goto Top
Hallo evotoy!
ich hab mal versucht, meine letzte batch und die neue zusammen zu ###en.
Vielleicht wäre "gut zureden" (auch im Hinblick auf den Osterfrieden) die bessere Strategie - Biber (und wenn sich einer mit Batchen auskennt, dann er) meint jedenfalls, ein Batch hätte auch Gefühle ... face-wink
Bevor ich mir das Ganze später genauer ansehe, ein Hinweis: Anstelle von "goto :1" und "goto :5" wäre jeweils "goto :eof" zu schreiben.

Grüße
bastla
Member: evotoy
evotoy Apr 04, 2010 at 11:35:44 (UTC)
Goto Top
oh ... kleiner tippfehler!! ich korrigier das mal - nich das die Batches eingeschnappt sind face-smile
Member: bastla
bastla Apr 04, 2010 at 13:11:26 (UTC)
Goto Top
Hallo evotoy!

Hoffentlich zicken die jetzt nicht doch herum (getestet hab' ich nämlich nicht face-wink):
@echo off & setlocal & goto :Start
:2
set name=%name:_occlusion=-occlusion%
ren %1 "%Name:~-2%-%Name:~,-4%%~x1"   
echo %1 {{comment_strings:22692819291}} 
goto :eof

:4
if not exist "%Name1:~3%" (  
    echo __________________________________________    
    echo              Erstelle Ordner   : %Name1:~3%   
    echo __________________________________________        
    md "%Name1:~3%"  
)
move "%name1%%~x1" "%Name1:~3%\"  
goto :eof


:Start
echo __________________________________________
echo __________///  Umbenennen \\\_____________
echo __________________________________________

set "MaskRename=*00??.*"  
for /f "delims=" %%i in ('dir /b %MaskRename%') do set "Name=%%~ni" & call :2 "%%i"  

echo __________________________________________    
echo Umbenennen beendet.   
echo __________________________________________    
echo\
echo\
echo __________________________________________
echo ___________///  Sortieren \\\_____________
echo __________________________________________

set "MaskSort=??-*.*"  
for /F "delims=" %%i in ('dir/b %MaskSort%') do set "Name1=%%~ni" & call :4 {{comment_strings:22884376299}}  

echo __________________________________________    
echo Sortiervorgang beendet.    
echo __________________________________________  
pause
Die beiden Unterprogramm (hätte ich vielleicht nicht mit ":2" und ":4" benannt - sonst heißt es gleich wieder: "Ich bin nur eine Nummer für Dich - nicht mal die Mühe, mir einen Namen zu geben, hast Du Dir gemacht!" face-wink) habe ich etwas prominenter am Anfang des Batches platziert - ob's der Performance hilft, musst Du selber beurteilen ...

Das "Ordner-Erstellen" ist jetzt etwas eingedampft, und die Unterdrückung der Fehler (mit "2>nul") beim Erstellen des Ordners bzw beim Verschieben habe ich entfernt - wenn es hier einen Fehler gibt, solltest Du den auch gemeldet bekommen.

Grüße
bastla
Member: evotoy
evotoy Apr 04, 2010 at 19:02:11 (UTC)
Goto Top
Danke!!! Das bau ich noch ein ...
Member: Biber
Biber Apr 04, 2010 at 23:29:01 (UTC)
Goto Top
[OT]
Zitat von @evotoy:
oh ... kleiner tippfehler!! ich korrigier das mal - nich das die Batches eingeschnappt sind face-smile
Danke, evotoy, fürs Korrigieren..
BTW, ich war ganz fest davon ausgegangen, dass der versehentlich vergessene Buchstabe ein "W" wäre und war total überrascht von einem "M".
Dachte, es ginge ums Zusammenbraten und nicht ums Zusammenwerfen...

Na egal.... alles bleibt gut...
Und ich wäre ja hier im Forum der Letzte, der irgendwelche ungelegten Haarspaltereien über den Zaun bricht...äh...oder so ähnlich.

Grüße
Biber
[/OT]
Member: evotoy
evotoy Apr 05, 2010 at 17:45:47 (UTC)
Goto Top
So ... vielen Dank nochmal!!

hier die finale version für alle, die ein ähnliches Problem plagtface-smile

@echo off & setlocal & goto :Start

:umbenennen
  set name=%name:_occlusion=-occlusion%
  ren %1 "%Name:~-2%-%Name:~,-4%%~x1"   
  echo %1 "%Name:~-2%-%Name:~,-4%%~x1"  
  goto :eof

:sortieren
  if not exist "%Name1:~3%" (  
    echo    Erstelle Ordner   : %Name1:~3%   
    md "%Name1:~3%"  
  )
  move "%name1%%~x1" "%Name1:~3%\"  
  goto :eof

:checken
  if exist "%Name2:~,-10%" (  
    echo    gecheckt: %Name2:~,-10%
  ) ELSE (
    echo ...
    echo !!! In der Benennung von "%Name2:~,-10%" und dem Pass ist ein Fehler !!!  
    echo ...)
  goto :eof


:Start
  echo __________///  Umbenennen \\\_____________
  echo ==========================================

  set "MaskRename=*00??.*"  
  for /f "delims=" %%i in ('dir /b %MaskRename%') do set "Name=%%~ni" & call :umbenennen "%%i"  

  echo __________________________________________    
  echo :::::   Umbenennen beendet.   
  echo\
  echo\
  echo ___________///  Sortieren \\\_____________
  echo ==========================================

  set "MaskSort=??-*.*"  
  for /F "delims=" %%i in ('dir/b %MaskSort%') do set "Name1=%%~ni" & call :sortieren "%%i"  

  echo __________________________________________  
  echo :::::   Sortieren beendet.    
  echo\
  echo\
  echo ___________///  Checken \\\_______________
  echo ==========================================

  set "MaskCheck=*-occlusion"  
  for /F "delims=" %%i in ('dir/b %MaskCheck%') do set "name2=%%i" & call :checken "%%i"  

  echo __________________________________________  
  echo :::::   Checken beendet.  
 
pause

1. Dateien nach Muster umbenennen
2. Dateien in Ordner mit Teilen vom Dateinamen einsortieren
3. Erstellte Ordnernamen checken (da manuelle Benennung und per Batch generierte)

vg,
Member: bastla
bastla Apr 06, 2010 at 20:47:09 (UTC)
Goto Top
Hallo evotoy!

Danke für den Abschluss des Threads - und Dein Batches sind jetzt, wo Du sie so schön herausgeputzt hast, sicherlich auch wieder versöhnt ... face-smile

Grüße
bastla