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-Key: 286914

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

Printed on: April 23, 2024 at 13:04 o'clock

Mitglied: 122990
122990 Oct 28, 2015 at 12:19:02 (UTC)
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
Member: Friemler
Solution Friemler Oct 28, 2015, updated at Oct 29, 2015 at 13:36:09 (UTC)
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
Member: chainsaw
chainsaw Oct 29, 2015 updated at 12:46:58 (UTC)
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
Member: chainsaw
chainsaw Oct 29, 2015 at 12:46:37 (UTC)
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
Member: chainsaw
chainsaw Oct 29, 2015 at 13:36:03 (UTC)
Goto Top
Nochmal ich,

habs gefunden:

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

Danke für die Hilfe!
Gruß Andi
Member: Friemler
Friemler Oct 29, 2015 updated at 14:04:45 (UTC)
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