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:
Der Schnipsel funktioniert - aber nur bei einstelligen PDF`s.
Hat jemand eine Idee wie man das lösen könnte?
Schönen Tag
chainsaw
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 23.10.2009 um 10: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-ID: 127422
Url: https://administrator.de/forum/dateinamen-auf-gleiche-laenge-bringen-nullen-auffuellen-127422.html
Ausgedruckt am: 23.12.2024 um 04:12 Uhr
9 Kommentare
Neuester Kommentar
Moin chainsaw,
dein Ansatz oben ist eher überzeugend als der jetzt gefundene Workaround
Bau lieber den ":tuWas"-Block oben um nach dieser Skizze:
Vor dem REN steht im Moment noch ein @echo zum testen 8was ich auch nicht getan habe bisher)
Die Zeile
Grüße
Biber
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
Sollte so gehen:
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]
@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
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]
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)
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
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
Hallo chainsaw!
Richtig müsste die Zeile daher lauten:
Grüße
bastla
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 ... Richtig müsste die Zeile daher lauten:
echo "123456789"|findstr "%Alt:~,1%" || goto :eof
bastla