hausen
Goto Top

Dateinamen prüfen und evtl. umbenennen

Hallo Forum,

ich habe in einem Ordner mehrere pdf-Dateien die wie folgt aussehen:

OB1.pdf
OB82.pdf
OB100.pdf
FC1.pdf
FC20.pdf
FC100.pdf
UDT1.pdf
UDT2.pdf

usw...

Wie oben schon geschrieben möchte ich diese Dateien nun umbenennen und zwar wie folgt.
Ich möchte überprüfen welche Anzahl an Zahlen der Dateiname enthält und diese entsprechend
mit Nullen auffüllen, so dass immer 3 Zahlen im Dateinamen enthalten sind. Die Nullen sollen
immer vor der vorhandenen Zahl eingefügt werden.
Es sollte danach dann so ausshen

OB001.pdf
OB082.pdf
OB100.pdf
FC001.pdf
FC020.pdf
FC100.pdf
UDT001.pdf
UDT002.pdf

Kann mir da jemand Helfen?

Danke und Gruss

Norbert

Content-ID: 150228

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

Ausgedruckt am: 13.11.2024 um 09:11 Uhr

77559
77559 02.09.2010 um 20:15:50 Uhr
Goto Top
Hallo Norbert,
die folgende Batchdatei verarbeitet alle Pdf-Dateien im aktuellen Verzeichnis deren Namen eine beliebige Anzahl Buchstaben gefolgt von mindestens einer Ziffer beinhaltet.
:: Trail#3pl.cmd :::::::::::::::::::::::::::::::::::::::::::::::::::::
@Echo off
For /f "delims=" %%A in (  
  'Dir /B/A-D *.pdf ^|findstr /i "[a-z][a-z]*[0-9][0-9]*\.pdf" '  
    ) Do For /f "tokens=1 delims=0123456789" %%B in (  
      "%%~nA"  
        ) do Call :Proc "%%~fA" "%%B"  
Pause
goto :Eof
:Proc
Set "Name=%~n1"  
Set "Prefix=%~2"  
Call Set Zahl=100%%Name:%Prefix%=%%
If %Zahl% GTR 10099 goto :Eof
Echo Ren %1 "%Prefix%%Zahl:~-3%%~x1"  
Ren %1 "%Prefix%%Zahl:~-3%%~x1"  

Wenn die Ausgabe auf dem Bildschirm korrekt erscheint, das Echo in der letzten Zeile (und ggfs den Pause Befehl) entfernen.
Auf Wunsch erläutere ich gerne den Algorhytmus.

Gruß
LotPings

Edit: Einige Änderungen eingebaut (unter anderem Fehler bei 2. Durchlauf mit führenden Nullen)
Biber
Biber 02.09.2010 um 21:14:53 Uhr
Goto Top
Moin Hausen und Lordchen,

wir befinden uns in einem Forum, in dem ich mich über ganz oft über den abschliessenden Kommentar eines Fragestellers freue,
wenn aus diesem Kommentar ein "Ahhh, JETZT hab ich's verstanden!" durchklingt.
Ist mir 100 mal lieber als ein "Danke, klappt."

Der Unterbereich "Batch & Shell", in dem wir uns hier befinden, ist zudem ein Unter-Unterbereich von "Entwicklung".
Und für mich gehört zum "Entwickeln" auch das Verstehen (bzw. das Verständlich-Machen) der Strategie, des Algorithmus dazu.

Von daher, @77559, bin ich natürlich spontan begeistert von der guten Idee und der eleganten Umsetzung.
Aber mit dem Angebot "Auf Wunsch erläutere ich gerne..." eher unglücklich.

Ich würde die letzte Zeile noch dahingehend abändern, dass nicht versucht wird, Dateien umzubenamsen, die schon der "neuen" Namenskonvention entsprechen.

Also:
::.....
:: Statt bisher letzte Zeile:
::echo Ren %1 "%Prefix%%Zahl:~-3%%~x1"  
::-- jetzt neu letzte Zeile
if "%~n1" NEQ "%Prefix%%Zahl:~-3%" echo Ren %1 "%Prefix%%Zahl:~-3%%~x1"  

unterschied (zuerst mit alter Zeile, zweiter Durchlauf mit neuer letzter Zeile):
>Lotpinx_Trail#3pl.cmd
if "test1" NEQ "test001" Ren "F:\schnipsel\test1.pdf" "test001.pdf"
if "test21" NEQ "test021" Ren "F:\schnipsel\test21.pdf" "test021.pdf"
if "test231" NEQ "test231" Ren "F:\schnipsel\test231.pdf" "test231.pdf"
Drücken Sie eine beliebige Taste . . .

(=21:09:42  F:\schnipsel=)
>Lotpinx_Trail#3pl.cmd
Ren "F:\schnipsel\test1.pdf" "test001.pdf"
Ren "F:\schnipsel\test21.pdf" "test021.pdf"
Drücken Sie eine beliebige Taste . . .

Grüße
Biber
Hausen
Hausen 03.09.2010 um 08:37:41 Uhr
Goto Top
Hallo LotPings und Biber,

astrein, genau das was ich brauche. Über eine Erläuterung wäre ich sehr dankbar. Verstehe leider nicht alles.

Habe nur ein Problem face-sad. Im Dos-Fenster zeigt er mir alles richtig an und meldet auch keine Fehler aber er benennt die
Dateien nicht um.

Habe die Dateien und den Ordner auch mal an eine andere stelle kopiert, ohne Erfolg.
Das einzige was ist, wenn ich auf die Ordnereigenschaften gehe, ist schreibgeschützt angehackt aber gegraut.
Kann das aber nicht abwählen bzw. ist ist der hacken weg und danach direkt wieder da.

Könnt Ihr Euch das erklären?

Gruss Norbert

P.S. Arbeite mit XP SP3
77559
77559 03.09.2010 um 12:25:34 Uhr
Goto Top
Hallo Norbert,

Ich gehe mal davon aus das du den Echo-Befehl entfernt hattest?
Ansonsten hört es sich nach einem Rechte/Schreibschutz-Problem an, schau mal mit attrib *.pdf nach.

@Biber, stimme dir vorbehaltlos zu, war gestern etwas Erklärungsmüde face-wink

Zur Erläuterung:
die erste For-Schleife in Z3 nudelt alle vom Dir kommenden und von dem regulären Ausdruck des Find auf Buchstaben/Ziffern gefilterten pdf-Dateien durch,
die zweite For-Schleife in Z5 trennt das Prefix (=token 1) von der folgenden Zahl ab indem alle Ziffern als delimiter gesetzt werden.
Mit dem kompletten Dateinamen als Argument 1 und dem ermittelten Prefix als Argument 2 wird die Subroutine Proc aufgerufen.
In der Sub :Proc wird nur der Namensbestandteil der Variable Name und Arg2 der Variable Prefix zugewiesen
Der Pseudo Call in Z13 dient in Verbindung mit gedoppelten %-Zeichen zur verzögerten Auswertung von
%%NAME:%Prefix%=%% dies löscht den ermittelten Prefix aus dem Namen so das nur die Zahl übrig bleibt.
Z13 musste ich ändern weil der alte Set /A Probleme mit bereits enthaltenen führenden Nullen hatte
Da durch den Find sichergestellt ist, das wirklich nur Ziffern in der Zahl sind, und ich nur umbenennen will, wenn weniger als 3 Stellen vorhanden sind hänge ich vor die Zahl 100, ist Zahl größer als 10099 brauche ich nichts zu tun und verlasse die Sub. Dies erübrigt dann auch Bibers zusätzliche If-Abfrage.

Gruß
LotPings
Hausen
Hausen 03.09.2010 um 13:17:31 Uhr
Goto Top
Hallo zusammen,

habe den Fehler gefunden face-smile

bei dem Änderungsvorschlag von Bieber hat sich der Fehlerteufel eingeschlichen face-wink

::-- jetzt neu letzte Zeile
if "%~n1" NEQ "%Prefix%%Zahl:~-3%" echo Ren %1 "%Prefix%%Zahl:~-3%%~x1"  

In der Zeile muss das "echo" entfernt werden

::-- jetzt neu letzte Zeile
if "%~n1" NEQ "%Prefix%%Zahl:~-3%" Ren %1 "%Prefix%%Zahl:~-3%%~x1"  

So das der funktionierende Code wie folgt aussieht:

:: Trail#3pl.cmd :::::::::::::::::::::::::::::::::::::::::::::::::::::
@Echo off
For /f "delims=" %%A in (  
  'Dir /B/A-D *.pdf ^|findstr /i "[a-z][a-z]*[0-9][0-9]*\.pdf" '  
    ) Do For /f "tokens=1 delims=0123456789" %%B in (  
      "%%~nA"  
        ) do Call :Proc "%%~fA" "%%B"  
Pause
goto :Eof
:Proc
Set "Name=%~n1"  
Set "Prefix=%~2"  
Call Set Zahl=100%%Name:%Prefix%=%%
If %Zahl% GTR 10099 goto :Eof
Echo Ren %1 "%Prefix%%Zahl:~-3%%~x1"  
if "%~n1" NEQ "%Prefix%%Zahl:~-3%" Ren %1 "%Prefix%%Zahl:~-3%%~x1"  

Herzlichen Dank Euch beiden für die rasche und kompetente Hilfe!!

Gruss Norbert
77559
77559 03.09.2010 um 13:24:41 Uhr
Goto Top
Hallo Norbert,

wie ich in der Erläuterung schrieb, ist in der obigen Version die zusätzliche If-Abfrage in Z16 Hyperfluid = überflüssig.
Bereits 3-Stellige Zahlen passieren nicht durch die Zeile 14.

Gruß
LotPings