chainsaw
Goto Top

Dateien neu nummerieren anhand des Dateinamens

Hallo Gemeinde,

ich hänge mit meinen wenigen Batchkenntnissen wieder mal an einem Problem fest und bitte euch um Hilfe.

Folgendes Problem: Ich habe jede Menge PDF-Dateien die immer alle gleich lang sind, aber unterschiedlich heißen.
In diesen PDFen steckt eine Nummerierung im Dateinamen. Diese ist dreistellig. Ich möchte die Nummerierung
immer um den Wert zwei reduzieren und da fangen meine Probleme nun an.

Die Dateien sehen im etwa so aus:

Wert.Sorte.20151025.003000.22.00.pdf
Wert.Sorte.20151025.004000.35.00.pdf
Wert.Sorte.20151025.015000.17.00.pdf
Wert.Sorte.20151025.026000.89.00.pdf

Ich möchte nun aus 003 die 001, aus 004 die 002 aus 015 die 013 und aus 026 die 024 machen usw.

Mein Ansatz war jetzt den Dateinamen zu zerlegen und die Nummerierung einer Variable zuzuweisen:

set "Alt=%~n1"  
set "T4=%Alt:~21,2%"  

dadurch erhalte ich als Variable die zweistelligen Werte (zweistellig reicht aus) 03, 04, 15 und 26. Diese Variable kann ich nun
neu erzeugen. Das habe ich so gemacht:

set counter=%T4%
set /a counter-=2

So werden die zweistelligen Daten richtig umbenannt, aber anscheinend hat der Batch ein Problem,
mit den Werten 03, 04 etc. zu rechnen. Da zerbröselt es mich immer.

Ein Weitere Ansatz war nun, die Seiten zu sortieren (unter 10 und über 10). Damit komme ich aber
überhaupt nicht klar.

Hat jemand eine Idee wie ich hier weiterkomme?
Danke und Gruß
chainsaw

Content-ID: 286914

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

Ausgedruckt am: 26.11.2024 um 04:11 Uhr

122990
122990 28.10.2015 um 13:19:02 Uhr
Goto Top
Powershell-Einzeiler ...
gci c:\ordner\*.pdf | rename-item -NewName {$_.Name -replace '^(.*\..*\..*)\.(\d{3})(.*)$',("`$1.$(([int]$_.Basename.Split('.')[3].Substring(0,3) -2).toString().PadLeft(3,'0'))`$3")}  
Gruß grexit
Friemler
Lösung Friemler 28.10.2015, aktualisiert am 29.10.2015 um 14:36:09 Uhr
Goto Top
Hallo chainsaw,

Deine Probleme dürften bei Dateien auftauchen, deren Nummer 008XXX, 009XXX, 018XXX, 019XXX, 028XXX, 029XXX, ... lautet. Durch die führenden Nullen werden diese Zahlen vom Batchscript-Interpreter als Oktalzahlen interpretiert, im Oktalsystem existieren die Ziffern 8 und 9 aber nicht.

Du musst also dafür sorgen, dass die führenden Nullen beseitigt werden. Das könnte so gehen:
@echo off & setlocal

set "FileName=Wert.Sorte.20151025.008000.22.00.pdf"  

call :ChangeFileName "%FileName%"  
echo %NewFileName%

exit /b 0



:ChangeFileName
  for /f "tokens=1-4* delims=." %%a in ("%~1") do (  
    for /f "tokens=* delims=0" %%x in ("%%d") do (  
      call :SetNewFileName "%%a.%%b.%%c." "%%x" ".%%e"  
    )
  )
exit /b 0


:SetNewFileName
  set /a Counter=%~2 / 1000 - 2
  set "Counter=00%Counter%"  
  set "Counter=%Counter:~-3%"  

  set "NewFileName=%~1%Counter%%~3"  
exit /b 0

Die führenden Nullen werden durch die innere FOR-Schleife im Unterprogramm ChangeFileName beseitigt und der neue Dateiname im Unterprogramm SetNewFileName zusammengesetzt.

Gruß
Friemler
chainsaw
chainsaw 29.10.2015 aktualisiert um 13:46:58 Uhr
Goto Top
Hallo zusammen,

also mit Powershell wüsste ich jetzt gar nicht wie ich das zum laufen bringe - tu mir ja mit Batch schon schwer face-wink

@ Friemler: Genau das ist das Probem - bis 7 funktioniert das tadellos, aber bei 8 und 9 nicht - wie du geschrieben hast.
Ich teste mal deinen Vorschlag. Vielen Dank mal soweit!

Gruß Chainsaw
chainsaw
chainsaw 29.10.2015 um 13:46:37 Uhr
Goto Top
@ Friemler: Funktioniert fast. Als Ergebnis erhalte ich bei "Wert.Sorte.20151025.008000.22.00.pdf" nun "Wert.Sorte.20151025.006.22.00.pdf". Die drei Nullen nach der Seitenzahl sind nach dem umbenennen nicht
mehr da.
Ich könnte nach dem erfolgreichen umbenennen den Dateinamen noch einmal zerlegen und die Nullen beim
Renamen einfügen, aber vielleicht hast du ja eine elegantere Lösung.

Danke und Gruß
Andi
chainsaw
chainsaw 29.10.2015 um 14:36:03 Uhr
Goto Top
Nochmal ich,

habs gefunden:

set "NewFileName=%~1%Counter%000%~3"  

Danke für die Hilfe!
Gruß Andi
Friemler
Friemler 29.10.2015 aktualisiert um 15:04:45 Uhr
Goto Top
Hallo chainsaw,

schön, dass Du Dir selbst helfen konntest. Ich dachte es wäre eine Anforderung von Dir, die 3 Nullen verschwinden zu lassen.

Du könntest das Problemchen aber auch anders lösen. Ersetze Zeile 22 durch
set /a Counter=%~2 - 2000
und mache Deine o.g. Änderung wieder rückgängig. Das ist doch etwas eleganter, als zuerst die Nullen wegzunehmen (durch die Division mit 1000) und hinterher wieder hinzuzufügen.

Falls an dieser Position mal drei andere Ziffern als 000 stehen würden, blieben diese dann auch erhalten.

Gruß
Friemler