chainsaw
Goto Top

Dateinamen auf gleiche länge bringen (Nullen auffüllen)

Hallo Gemeinde,

ich habe ein Verzeichnis, in dem liegen regelmäßig ca. 140 PDF-Dateien.

Die Daten liegen in folgendem Format vor:

1.pdf
2.pdf
...
13.pdf
67.pdf
...
103.pdf

Ich muß nun alle Namen auf gleiche Länge bringen, also bei den einstelligen zwei Nullen vorne anhängen
und bei den zweistelligen eine Null anhängen. Die dreistelligen sollen so bleiben.

das ist mein bisheriger Ansatz:

@echo off & setlocal 

set "Dateien=D:\Daten"  
set /p var=Name eingeben:

for /f "delims=" %%i in ('dir /b "%Dateien%\*.PDF"') do call :Tuwas "%Dateien%\%%i"   
goto :eof 

:Tuwas 
set "Alt=%~n1"   
set "T1=%Alt:~0,1%"   
ren %1 "%var%00%T1%%~x1"   
goto :eof

Der Schnipsel funktioniert - aber nur bei einstelligen PDF`s.
Hat jemand eine Idee wie man das lösen könnte?

Schönen Tag
chainsaw
Kommentar vom Moderator Biber am Oct 23, 2009 um 08:41:16 Uhr
OT-Kommentare unterhalb des Kommentars bastla schreibt am 21.10.2009, 10:36:03 Uhr in Absprache mit bastla und chainsaw gelöscht.

Content-Key: 127422

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

Printed on: April 19, 2024 at 14:04 o'clock

Member: chainsaw
chainsaw Oct 19, 2009 at 14:22:27 (UTC)
Goto Top
Nochmal ich,

ich hab jetzt ne Lösung aber das ist wohl nicht die eleganteste:

Mit den Zeilen unten sortiere ich die einstelligen und zweistelligen Dateien aus und verschiebe sie jeweils in einen
eigenen Ordner. Dort kann ich dann auf dreistellige Namenskonvention umbenennen und move die Dateien dann
wieder zurück in den ursprünglichen Ordner.

move %Dateien%\?.pdf %eins%
move %Dateien%\??.pdf %zwei%

Für die Profis hier sicherlich eine "billige" Lösung aber anders bekomm ich`s nicht hin.
Vielleicht fällt jemandem noch was eleganteres ein - ich will ja was dazulernen! face-smile

Gruß chainsaw
Member: Biber
Biber Oct 19, 2009 at 14:56:44 (UTC)
Goto Top
Moin chainsaw,

dein Ansatz oben ist eher überzeugend als der jetzt gefundene Workaround

Bau lieber den ":tuWas"-Block oben um nach dieser Skizze:
@echo off & setlocal 

set "Dateien=D:\Daten"  
for /f "delims=" %%i in ('dir /b "%Dateien%\*.PDF"') do call :Tuwas "%Dateien%\%%i"   
goto :eof 

:Tuwas 
set "Neu=10000%~n1"   
REM ---jetzt steht also bei Datei "23.pdf" der Wert "1000023" in %Neu%  
@echo IF /i "%~n1" NEQ "%Neu:~-3,3%" REN "%~1" %Neu:~-3,3%%~x1  
goto :eof

Vor dem REN steht im Moment noch ein @echo zum testen 8was ich auch nicht getan habe bisher)
Die Zeile
REN "%~1" %Neu:~-3,3%%~x1
sollte laut Plan aufgelöst werden zu ..neuer name = die letzten 3 Stellen der Variablen %Neu%
REN "alter PdfName incl Pfad" "nnn.pdf"

Grüße
Biber
Member: bastla
bastla Oct 19, 2009 at 14:57:10 (UTC)
Goto Top
Sollte so gehen:
@echo off & setlocal
set "Dateien=D:\Daten"  
set "Typ=PDF"  
set /p var=Name eingeben: 

pushd "%Dateien%"  
for /f "delims=" %%i in ('dir /b *.%TYP%') do call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
set "Alt=%~n1"  
echo "123456789"|findstr /b "%Alt:~,1%" || goto :eof  
set /a Nr=1000+Alt
ren %1 "%var%%Nr:~-3%%~x1"  
goto :eof
Grüße
bastla

[Edit] Unterprogramm so geändert, dass nur mit einer Ziffer <> "0" beginnende Dateinamen verarbeitet werden [/Edit]

[Edit2] @Biber: Soviel zum Thema "Rechtsüberholer" ... [/Edit]
Member: chainsaw
chainsaw Oct 20, 2009 at 09:00:29 (UTC)
Goto Top
@Biber und bastla,

Bin wieder mal schwer beeindruckt von euch - Danke euch beiden! face-smile

@Biber:
Funktioniert perfekt, wenngleichich trotz deiner Erklärung nicht ganz verstehe was genau passiert.

Mit set "Neu=10000%~n1" bringst du erst mal alle Dateien, egal ob ein, zwei oder drei Stellen auf achstellig, oder?
Hier >> @echo IF /i "%~n1" NEQ "%Neu:~-3,3%" REN "%~1" %Neu:~-3,3%%~x1 zerpflückst du das ganze dann wieder, oder?

Ist es unverschämt, wenn ich dich bitte, mir die Zeile näher zu erläutern? Ich möchte ja was lernen! face-smile


@baslta:
In deiner Variante scheint noch was nicht zu klappen

Schönen Gruß
chainsaw
Member: Biber
Biber Oct 20, 2009 at 11:18:59 (UTC)
Goto Top
Moin chainsaw,

ich versuch mal zu erklären (auch wenn das nicht meine starke Seite ist).

Ich habe ja gestern (anders als bastla) die im Eröffnungsbeitrag gepostete Variante mit einem weiteren Präfix im Dateinamen ignoriert.
Dieses mit SET/P abgefragte %var%-Krams. Gehörte für mich eher nicht zum eigentlichen Problem.

Also blieb für mich die Aufgabe, dass (als Beispiel)
  • im ersten Durchgang die Dateien 1.pdf, 27.pdf und 144.pdf REINgehen in die Verarbeitung und als 001.pdf, 027.pdf und 144.pdf RAUSgehen sollen
  • in einem späteren Durchgung können dann die Dateien 2.pdf, 33.pdf vorliegen und immer noch die Dateien 001.pdf, 027.pdf und 144.pdf.

Wegen den Dateien mit führender "0" im Namen wolte ich auf ein SET /A ("Rechen"-Anweisung im Batch) verzichten, weil bei Zahlen dieser Art die CMD.exe immer mit mir diskutiert, ob ich denn Oktalwerte meine. Deshalb bin ich lieber auf String-Verkettung/kein Rechnen ausgewichen.

Schritt 1 war also das Bilden eines minimal 6stelligen, max 8stelligen Strings
Aus 1.pdf wird -->Neu=100001.pdf
Aus 27.pdf wird -->Neu=1000027.pdf
Aus 144.pdf wird -->Neu=10000144.pdf

im zweiten Schritt übernehme ich dann von diesem mindestens 6 Stellen langen String die letzten 3 Stellen
Aus 1.pdf wird -->Neu=100001.pdf"-->davon die letzten 3 Stellen --> %Neu:~-3,3%" ----> 001.pdf
Aus 27.pdf wird -->Neu=1000027.pdf"-->davon die letzten 3 Stellen --> %Neu:~-3,3%" ----> 027.pdf
Aus 144.pdf wird -->Neu=10000144.pdf"-->davon die letzten 3 Stellen --> %Neu:~-3,3%" ----> 144.pdf

[im zweiten Durchgang eventuell auch:
Aus 027.pdf wird -->Neu=1000027.pdf"-->davon die letzten 3 Stellen --> %Neu:~-3,3%" ----> 027.pdf ## hier Name vorher=Name nachher##
]


Sicherheitshalter noch die Prüfung, ob ich eventuell eine Datei in das umbenamsen will, was nun schon ihr Name ist.
@echo IF /i "%~n1" NEQ "%Neu:~-3,3%" ---> prüfe, ob "Dateiname-ohne-Endung-von-Parameter1" gleich dem Ergebnis "letzte 3 Stellen".

NICHT abgefangen habe ich jetzt, dass eventuell auch eine Datei 7.pdf angefasst wird, aber bereits eine Datei 007.pdf schon existiert.
Diese Kollision (falls bei deiner Anforderung denkbar) kannst du aber sicherlich noch mit einer "IF NOT EXIST-Erweiterung einbauen.

Grüße
Biber
Member: chainsaw
chainsaw Oct 20, 2009 at 12:39:12 (UTC)
Goto Top
Hallo Biber,

Wow - super - langsam kommt Licht in mein Dunkel.
Vielen Dank, dass du dir so viel Arbeit gemacht hast. Sehr nett!

Ich setzte den Beitrag jetzt auf gelöst.

Schönen Tag noch
Gruß chainsaw
Member: bastla
bastla Oct 20, 2009 at 13:23:57 (UTC)
Goto Top
Hallo chainsaw!

Nur der Ordnung halber (eine funktionierende Lösung hast Du ja schon): Wo liegt das Problem bei meinem Ansatz?

Grüße
bastla
Member: chainsaw
chainsaw Oct 21, 2009 at 08:24:53 (UTC)
Goto Top
Hallo bastla,

Sorry hatte gestern keine Zeit mehr zum testen - jetzt funktioniert auch deine Variante.

Ich habe in Zeile 13

echo "123456789"|findstr /b "%Alt:~,1%" || goto :eof   
die Doppelpipes duch && ersetzt

echo "123456789"|findstr /b "%Alt:~,1%" && goto :eof   
- jetzt geht`s.

Du hast ja einen ähnlichen Ansatz hast wie Biber - erst hängst du Nullen an, und dann nimmst du
die letzten drei Stellen des Dateinamens weg, oder?
Ich kapiers ja ehrlich gesagt nur scheibchenweise, aber was bewirkt >echo "123456789" < genau?

Schöne Grüße
chainsaw
Member: bastla
bastla Oct 21, 2009 at 08:36:03 (UTC)
Goto Top
Hallo chainsaw!
was bewirkt >echo "123456789" < genau?
Damit wird dem folgenden "findstr" etwas zum Durchsuchen geliefert - konkret geht es darum,dass das erste Zeichen von %Alt% eine Ziffer (ausschließlich 0) sein soll und daher in "123456789" gefunden werden muss -allerdings hatte ich leider ein "/b" dabei, womit immer nur mit "1" verglichen wurde ... face-sad

Richtig müsste die Zeile daher lauten:
echo "123456789"|findstr "%Alt:~,1%" || goto :eof 
Grüße
bastla