sternex
Goto Top

Nur bestimmte Dateien mit Batch Script verschieben

Hallo,
ich möchte gerne mal Wissen ob mein Problem mit einem Batch Script überhaupt zu realisieren ist.

Es geht um eine große Anzahl an PDF Dateien wo im Dateinamen eine bestimmte Nummer steht und jede Nummer mindestens aus 3 Teilen besteht.
z.B.
54123_Teil_1.pdf
54123_Teil_2.pdf
54123_Teil_3.pdf
dann gibt es aber auch Nummern die mehrere Teile von Teil2 und 3 besitzen.
z.B.
64123_Teil_1.pdf
64123_Teil_2.pdf
64123_Teil_3.pdf
64123_2_Teil_2.pdf
64123_2_Teil_3.pdf
Damit ich aber diese aber weiter verarbeiten kann, ist es notwendig die Nummern in einen getrennten Ordner zu verschieben die mehr als aus 3 Teilen bestehen. Also am Ende sollten dann Ordner entstehen "3 Teile" "5 Teile" usw ...

Content-ID: 88490

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

Ausgedruckt am: 23.11.2024 um 04:11 Uhr

bastla
bastla 26.05.2008 um 19:10:04 Uhr
Goto Top
Hallo Sternex und willkommen im Forum!

Wenn nur die beiden dargestellten Arten von Dateinamen zu unterscheiden sind, sollte das so gehen:
@for %i in ("D:\Ordner\*_?_*.pdf") do @echo move "%i" "D:\5 Teile\"  
Zum Testen bitte über "Start / Ausführen... / CMD" eine Konsole öffnen und obige Zeile (mit angepassten Pfaden) ausführen. Es sollten damit alle Verschiebebefehle vorerst nur angezeigt werden. Wenn Du das "@echo" vor dem "move" entfernst, wird tatsächlich verschoben. Der Zielordner (im Beispiel "D:\5 Teile") muss schon vorher erstellt worden sein.

Alle Dateien mit "kurzen" Namen bleiben dann im Ausgangsordner zurück.

Falls Du das Ganze in einem Batch verwenden willst, muss jedes %i durch ein %%i ersetzt werden.

Grüße
bastla
bytecounter
bytecounter 26.05.2008 um 19:13:40 Uhr
Goto Top
Hallo,

Erstmal einen Gegenfrage: Von was für einem System sprechen wir??

Sofern ich die Fragestellung richtig interpretiert habe:

DOS/Windows -> wird schwierig (ev. mit Zusatztools, mal googlen)

Linux mit Bash -> Sollte klappen, auch hier einfach googlen

vg
Bytecounter
Biber
Biber 26.05.2008 um 19:26:25 Uhr
Goto Top
@bastla
so sah meine Lösung auch in etwa aus...

Lies nochmal die Aufgabe. *gg

die 5 Teile gehören "vertikal" zusammen.

Zu "64123" gehören 5 *.pdf's -nämlich alle die, die mit 64123 beginnen.

Und die müssen nicht etwas in einen Ordner "64123", sondern in den Ordner "fünfteiler".

...Wird nix mit Oneliner....

Grüße
Biber
bastla
bastla 26.05.2008 um 19:33:04 Uhr
Goto Top
@Biber

..Wird nix mit Oneliner....
Vielleicht doch (auch wenn's mit einer Variable schöner aussähe):
@for %i in ("D:\Ordner\*.pdf") do @for /f "delims=_" %a in ("%~ni") do @md "D:\Ordner\%a" 2>nul & move "%i" "D:\Ordner\%a\"  

Und die müssen nicht etwas in einen Ordner "64123", sondern in den Ordner "fünfteiler".
Meinst Du wirklich? Dann allerdings ...

Grüße
bastla
Sternex
Sternex 26.05.2008 um 19:38:21 Uhr
Goto Top
also es geht um windows. Ja und wie Biber schon sagt sollen die Teile mit 64123 in den ordner 5-Teiler. Am Ende sind es paar Tausend verschiedene Nummern und aus den Daten müssen eben die Nummern zu denen 5 PDFs gehören verschoben werden, damit am Ende nur noch die 3-teiler im Ordner sind.

Ich habe bisher keine Lösung wie man das Lösen könnte
miniversum
miniversum 26.05.2008 um 20:07:42 Uhr
Goto Top
Jetzt versuche ich es mal.
Hier mein ungetesteter Code:
@echo off
set "ordner=C:\Dateien"  
set lastfile=""  
set nr=0

FOR /F "delims=" %%i in ('dir /B "%ordner%\*.pdf"') do call:dofile "%%~i"  
goto:eof

:dofile
set name=%~n1
if "%name:~-1%" equ "%lastfile%" (  
set /a nr=%nr%+1
) else (
md "%ordner%\Teil %nr%" 2>NUL  
copy "%ordner%\%lastfile%*.pdf" "%ordner%\Teil %nr%"   
set nr=0
)
Sternex
Sternex 26.05.2008 um 20:20:26 Uhr
Goto Top
@ miniversum

Bei deinem Code entsteht ein neuer Ordner Teil 0 und es kopiert alle PDFs in den Ordner.
Es sollten jedoch nur die Nummern mit 5 PDF Dateien verschoben werden face-smile aber vll wird das ja noch? ;) danke schonmal
miniversum
miniversum 26.05.2008 um 20:34:10 Uhr
Goto Top
Korrektur:
@echo off
set "ordner=C:\Dateien"  
set "lastfile="  
set nr=0

FOR /F "delims=" %%i in ('dir /B "%ordner%\*.pdf"') do call:dofile "%%~i"  
goto:eof

:dofile
FOR /F "tokens=1 delims=_" %%i in ('echo %~1')do set "name=%%i"  
if "%name%" equ "%lastfile%" (  
set /a nr=%nr%+1
) else (
md "%ordner%\Teil %nr%" 2>NUL  
copy "%ordner%\%lastfile%*.pdf" "%ordner%\Teil %nr%"   
set "lastfile=%name%"  
set nr=0
)
Sternex
Sternex 26.05.2008 um 20:54:58 Uhr
Goto Top
jetzt entsteht ein Ordner Teil 4 wo die Nummern mit 5 PDF's hinkopiert werden aber sie sind noch im Quell Ordner. Diese müssten also nur verschoben werden und nicht kopiert. sieht aber schon sehr gut aus =) super
miniversum
miniversum 26.05.2008 um 21:09:13 Uhr
Goto Top
Dan ersetzte das
set nr=0
durch
set nr=1
Dann sollte das mit den richtigen Nummern passen.
Das copy war halt das wenn was scheif gehen würde nicht alles weg ist.
Wenn das dan ales richtig funktioniert kannst du das "copy" durch ein "move" ersetzen (würde es aber dennoch mit testdateien vorher versuchen).
Sicherer wäre es wenn du die Zeile
copy "%ordner%\%lastfile%*.pdf" "%ordner%\Teil %nr%"
so änderst:
copy "%ordner%\%lastfile%*.pdf" "%ordner%\Teil %nr%" && del "%ordner%\%lastfile%*.pdf"
Dann wird erst kopiert und danach gelöscht.
bastla
bastla 26.05.2008 um 21:11:52 Uhr
Goto Top
... stellt sich die Frage, ob das noch als Oneliner zählt (insbesondere in der neuen Code-Darstellung face-wink):
@for %i in ("D:\Ordner\*.pdf") do @for /f "delims=_" %a in ("%~ni") do @for /f %n in ('dir "D:\Ordner\%a*.pdf" 2^>nul^|findstr "Datei(en)" 2^>nul') do @if "%n" gtr "3" @move "D:\Ordner\%a*.pdf" "D:\5-Teiler\">nul  
Die Unterscheidung erfolgt übrigens über die Bedingung "mehr als 3 Dateien" - falls das Vorhandensein von exakt 5 Dateien geprüft werden soll, müsste
@if "%n" gtr "3"  
auf
@if "%n"=="5"  
geändert werden.

Die Voraussetzung, dass der Zielordner bereits vorhanden sein muss, gilt auch für diese Fassung - obwohl, für die paar Zeichen vorneweg hätte die Zeile bei Bedarf auch noch Platz ... face-wink

Grüße
bastla
Sternex
Sternex 26.05.2008 um 21:16:41 Uhr
Goto Top
Leider noch nicht ganz.

Bei der Änderung wird alles einfach in den Ordner "Teil 0" kopiert und der Ordner "Teil 4" bleibt leer.
Biber
Biber 26.05.2008 um 21:38:34 Uhr
Goto Top
<OT>
@ bastla und @miniversum

Vielleicht sollten wir mal ganz Verrücktes an dieser Stelle probieren..
Einen Batchschnipsel mit Kommentaren.

Welches arme Schwein soll denn denn das jemals warten können?

</OT>

Grüße
Biber

[Edit 27.5.2008]
DICKES DANKE @bastla für den musterhaft dokumentierten/kommentierten Schnipsel!
[/Edit]
bastla
bastla 26.05.2008 um 21:44:26 Uhr
Goto Top
@Biber

Ein Oneliner mit Kommentaren - geTuemII fände das sicher "hybsch" ... face-wink

Welches arme Schwein soll denn denn das jemals warten können?
Wenn's ohnehin kein Schwein verwendet ...
... aber gut, sollte Sternex meine Version brauchbar finden, schreibe ich noch was dazu.

Grüße
bastla
Sternex
Sternex 26.05.2008 um 21:56:24 Uhr
Goto Top
@ bastla

Deine Version die du weiter oben gepostet hattest, habe ich erst übersehen ;)
Aber diese Funktioniert Top! Kannst gern noch etwas dazu schreiben wenns noch besserungen gibt ;)

Wie ist das jetz wenn ich das über eine Batch Datei machen will? überall wo ein "%" ist zu "%%" abändern?
bastla
bastla 26.05.2008 um 22:26:49 Uhr
Goto Top
Hallo Sternex!

Wie ist das jetz wenn ich das über eine Batch Datei machen will? überall wo ein "%" ist zu "%%" abändern?
Würde genügen, aber ich schreib's (versprochen ist versprochen) gleich selbst als Batch (mit Kommentaren) rein:
@echo off & setlocal
rem ***************************************************
rem Variable fuer Pfade und Dateimuster hier festlegen;
rem damit wird es einfacher, den Batch anzupassen.

set "Quelle=D:\Ordner"  
set "Dateien=*.pdf"  
set "Ziel=D:\5-Teiler"  

rem ***************************************************

rem Falls der Zielordner noch nicht existiert, diesen erzeugen.
if not exist "%Ziel%\" md "%Ziel%"  

rem Alle passenden Dateien im Quellordner durchgehen ...
for %%i in ("%Quelle%\%Dateien%") do (  
    
    rem ... und davon den ersten Bestandteil (bis zum
    rem ersten "_") nur des Dateinamens (%%~ni) betrachten.  
    for /f "delims=_" %%a in ("%%~ni") do (  

        rem Ein Inhaltsverzeichnis aller Dateien mit gleichem ersten
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die
        rem Zeile mit der Anzahl der gefundenen Dateien - erkennbar
        rem am Bestandteil "Datei(en)" - verwenden und noch dafuer  
        rem sorgen, dass fuer den Fall, dass es keine weiteren
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler-  
        rem meldungen unterdrueckt werden.
        for /f %%n in ('dir "%Quelle%\%%a%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do (  

            rem Wenn die Anzahl mehr als 3 betraegt, alle Dateien mit
            rem dem gleichen Namensbeginn in den Zielordner ver-
            rem schieben. Damit die Namen der verschobenen Dateien
            rem nicht angezeigt werden, ">nul" verwenden.  
            if "%%n" gtr "3" @move "%Quelle%\%%a%Dateien%" "%Ziel%\">nul  
        )
    )
)
Der Zielordner wird jetzt auch durch den Batch erzeugt. Die oben beschriebene Anpassung, um auf genau 5 Dateien zu prüfen, gilt weiterhin.

Noch eine Anmerkung: Die derzeitige Fassung geht von maximal 9 zusammengehörigen Dateien aus (da bei zB 10 oder 11 gefundenen Dateien die Überprüfung auf >"3" fehlschlägt, da diese nicht numerisch, sondern auf Textbasis erfolgt).

Grüße
bastla
Sternex
Sternex 26.05.2008 um 22:35:54 Uhr
Goto Top
Vielen Dank für die schnelle Hilfe face-smile Auch an den Rest der mir geholfen hat.
Klappt wunderbar so

Grüße Sternex
geTuemII
geTuemII 26.05.2008 um 22:50:53 Uhr
Goto Top
Hallo bastla, hallo Biber <wink>,

Ein Oneliner mit Kommentaren - geTuemII fände das sicher "hybsch" ... face-wink
ist ja toll, zwischenzeitlich brauche ich das gar nicht mehr selbst zu sagen... face-smile

Beeindruckt,
geTuemII
bastla
bastla 26.05.2008 um 22:58:09 Uhr
Goto Top
Hallo geTuemII!

Da siehst Du's wieder - für Dich tun wir doch (fast) alles ... face-wink

Grüße
bastla
geTuemII
geTuemII 26.05.2008 um 23:05:59 Uhr
Goto Top
<träller> Für dich tun wir alles, für dich tun wir alles... </träller>
Da fällt mir doch glatt so ein alter Song ein face-wink Hab ich IMHO damals mit meiner Großmutter gesehen... Nich daß du glaubst, ich wäre schon so alt.

geTuemII
bastla
bastla 26.05.2008 um 23:10:20 Uhr
Goto Top
... Ihr habt damals auch schon Songs gesehen? Dann kann's ja nicht sooo lange her sein ... face-wink

bastla
geTuemII
geTuemII 27.05.2008 um 00:11:48 Uhr
Goto Top
Das verwechselst du mit MTV. Nein, das meinte ich nicht. Ich meine etwas, das (wenn ich micht recht entsinne, hieß das Filmmusical) face-wink

geTuemII
Sternex
Sternex 27.05.2008 um 19:12:43 Uhr
Goto Top
hallöchen an alle! ;)
nachdem ich den Script heute mal ausführlicher mit einer größeren Masse an PDF Daten testen wollte, kam als Ergebnis leider nur wild verschobene Daten bei herraus.
Also es wurden 3-Teiler und auch 5-Teiler verschoben manche auch garnicht.

Außerdem habe ich noch festgestellt das es auch 7-Teiler gibt und die Dateinamen am Anfang nicht immer 5 Zahlen haben sondern auch manchmal nur 3. Aber das sollte ja in dem aktuellen Script von bastla nicht stören.
Er hat mir auch schon versucht das neue Problem per PM zu lösen was aber leider dann garnicht mehr funktioniert hat.

Hier der momentane Script von Bastla:
@echo off & setlocal
rem *********************************************
rem Variable fuer Pfade und Dateimuster hier festlegen;
rem damit wird es einfacher, den Batch anzupassen.
set "Quelle=D:\Daten"  
set "Dateien=*.pdf"  
set "Ziel=D:\Daten\5-Teiler"  
rem *********************************************

rem Falls der Zielordner noch nicht existiert, diesen erzeugen.
if not exist "%Ziel%\" md "%Ziel%"  

rem Alle passenden Dateien im Quellordner durchgehen ...
for %%i in ("%Quelle%\%Dateien%") do (  
    
    rem ... und davon den ersten Namensbestandteil
    rem (bis zum ersten "_") betrachten  
    for /f "delims=_" %%a in ("%%~ni") do (  

        rem Ein Inhalteverzeichnis aller Dateien mit gleichem ersten
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden - 
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafür sorgen,  
        rem dass für den Fall, dass es keine weiteren zugehoerigen Dateien
        rem gibt, mittels "2>nul" Fehlermeldungen unterdrueckt werden.  
        for /f %%n in ('dir "%Quelle%\%%a%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do (  

            rem Wenn die Anzahl mehr als 3 betraegt, alle Dateien mit
            rem dem gleichen Namensbeginn in den Zielordner verschieben.
            rem Damit die Namen der verschobenen Dateien nicht angezeigt
            rem werden, die Ausgabe mit ">nul" unterdruecken.  
            if "%%n" gtr "3" @move "%Quelle%\%%a%Dateien%" "%Ziel%\">nul  
        )
    )
)
bastla
bastla 27.05.2008 um 20:51:31 Uhr
Goto Top
Hallo Sternex!

Aktueller Stand wäre (um einige Details ergänzt):
@echo off & setlocal
rem *********************************************
rem Variable fuer Pfade und Dateimuster hier festlegen;
rem damit wird es einfacher, den Batch anzupassen.

set "Quelle=D:\Ordner"  
set "Dateien=*.pdf"  
set "Ziel5=D:\5-Teiler"  
set "Ziel7=D:\7-Teiler"  

rem *********************************************

rem Falls die Zielordner noch nicht existieren, diese erzeugen.
if not exist "%Ziel5%\" md "%Ziel5%"  
if not exist "%Ziel7%\" md "%Ziel7%"  

rem Alle passenden Dateien im Quellordner durchgehen ...
for %%i in ("%Quelle%\%Dateien%") do (  
    
    rem ... und davon den ersten Namensbestandteil
    rem (bis zum ersten "_") betrachten  
    for /f "delims=_" %%a in ("%%~ni") do (  

        rem Ein Inhaltsverzeichnis aller Dateien mit gleichem ersten
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden - 
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer  
        rem sorgen, dass fuer den Fall, dass es keine weiteren
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler-  
        rem meldungen unterdrueckt werden.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do (  

            rem Wenn die Anzahl 5 bzw 7 betraegt, alle Dateien mit
            rem dem gleichen Namensbeginn in den jeweiligen Zielordner
            rem verschieben. Damit die Namen der verschobenen Dateien
            rem nicht angezeigt werden, die Ausgabe moch mit ">nul"  
            rem unterdruecken.
            if "%%n"=="5" move "%Quelle%\%%a_%Dateien%" "%Ziel5%\">nul  
            if "%%n"=="7" move "%Quelle%\%%a_%Dateien%" "%Ziel7%\">nul  
        )
    )
)
Kannst Du vielleicht einige Beispiel für Dateinamen, mit denen es nicht funktioniert hat, posten?

Grüße
bastla
Sternex
Sternex 27.05.2008 um 21:01:27 Uhr
Goto Top
Ja hatte ich erst aber da ging es nicht wie ich erst schon geschrieben habe ^^ aber anscheinend hatte ich einen Pfad versehentlich falsch angegeben jetz ging es.

Kann ich die Zeilen ...
if "%%n"=="7" @move "%Quelle%\%%a_%Dateien%" "%Ziel7%\">nul   
dann auch später noch beliebig erweitern?
bastla
bastla 27.05.2008 um 21:35:41 Uhr
Goto Top
Hallo Sternex!

Kann ich die Zeilen ...
if "%%n"=="7" @Move "%Quelle%\%%a_%Dateien%" "%Ziel7%\">nul
dann auch später noch beliebig erweitern?
Kannst Du; aber bitte daran denken, dass der Zielordner bereits existieren muss - daher auch
set "Ziel7=D:\7-Teiler"  
if not exist "%Ziel7%\" md "%Ziel7%"  
ergänzen.

Grüße
bastla
Sternex
Sternex 27.05.2008 um 21:43:10 Uhr
Goto Top
Alles klar.
und wenn ich alles was mehr wie 7 hat in einen Ordner packe, müsste es ja auch mit einem ">" funktionieren da es vll varieren kann wie viele es mehr sind. Aber das sind nur Einzelfälle.

also: if "%%n">"7" @Move "%Quelle%\%%a_%Dateien%" "%Ziel>7%\">nul

Ansonsten werde ich morgen nochmal das ganze richtig laufen lassen. Aber ich denke jetz müsste es so richtig klappen ;)
Danke!
bastla
bastla 27.05.2008 um 21:48:21 Uhr
Goto Top
... allerdings ist zum Einen die Grenze bei 9 Dateien (Begründung siehe oben) und andererseits die Schreibweise (zu den Vergleichsoperatoren siehe "if /?")
if "%%n" gtr "7" @move "%Quelle%\%%a_%Dateien%" "%Zielab8%\">nul  

Falls es tatsächlich nötig wäre, zweistellige Anzahlen zu erfassen, müssten wir eine etwas andere Vorgangsweise wählen (oder zumindest für jeden einzelnen Fall eine eigene "if"-Zeile verwenden) - sag im Fall des Falles Bescheid.

Grüße
bastla
Sternex
Sternex 27.05.2008 um 22:00:42 Uhr
Goto Top
Ja, das kann ich im Moment noch nicht ganz sagen ob es später auch zweistellige gibt.
Wie gesagt würde mich dann morgen noch einmal melden. Aber auch im aktuellen Zustand ist das Script schonmal sehr hilfreich.

Viele Grüße
Sternex
Sternex 31.05.2008 um 17:23:43 Uhr
Goto Top
Halli Hallo,
also ich bin sehr zufrieden mit dem Script face-smile Funktioniert!! Allerdings sollen in Zukunft tatsächlich auch zweistellige Anzahlen vorkommen.

Ach noch eine andere Frage. Ist es möglich auch PDF's auch nach Ihrer Seitenzahl zu sotieren? Also es gibts dazu ja auch ein Tool "APGetPageCount". Würde das theoretisch klappen in verbindung mit dem Script??

Viele Grüße
Sternex
bastla
bastla 31.05.2008 um 20:08:00 Uhr
Goto Top
Hallo Sternex!

Einfach wäre es, wenn nicht nur bestimmte Gruppen (3er, 5er, 7er) zu verschieben wären, sondern alle Dateien (es könnten dann eben auch Ordner "1-Teiler" oder "14-Teiler" entstehen) erfasst werden dürften - dann sähe das so aus:
@echo off & setlocal
rem **********************************************
rem Variable fuer Pfade und Dateimuster hier festlegen;
rem damit wird es einfacher, den Batch anzupassen.

set "Quelle=D:\Ordner"  
set "Dateien=*.pdf"  
set "Ziel=D:\Zielordner"  

rem **********************************************

rem Alle passenden Dateien im Quellordner durchgehen ...
for %%i in ("%Quelle%\%Dateien%") do (  
    
    rem ... und davon den ersten Namensbestandteil
    rem (bis zum ersten "_") betrachten  
    for /f "delims=_" %%a in ("%%~ni") do (  

        rem Ein Inhaltsverzeichnis aller Dateien mit gleichem ersten
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden - 
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer  
        rem sorgen, dass fuer den Fall, dass es keine weiteren
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler-  
        rem meldungen unterdrueckt werden.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do (  

            rem Anhand der festgestellten Anzahl an zusammengehoerigen
            rem Dateien falls erforderlich den entsprechen Zielordner
            rem erstellen und die Dateien verschieben. Damit die Namen
            rem  der verschobenen Dateien nicht angezeigt werden,
            rem die Ausgabe noch mit ">nul" unterdruecken.  
			if not exist "%Ziel%\%%n-Teiler" md "%Ziel%\%%n-Teiler"  
            move "%Quelle%\%%a_%Dateien%" "%Ziel%\%%n-Teiler"\>nul  
        )
    )
)
Wenn weiterhin die Anzahl vorgegeben werden soll, ist schön langsam eine Auflistung der Anzahlen erforderlich:
@echo off & setlocal
rem **********************************************
rem Variable fuer Pfade und Dateimuster sowie die
rem zusammenzufassenden Anzahl-Gruppen festlegen;
rem damit wird es einfacher, den Batch anzupassen.

set "Quelle=D:\Ordner"  
set "Dateien=*.pdf"  
set "Ziel=D:\Zielordner"  
set "Anzahlen=,12,11,10,9,7,5,3,"  

rem **********************************************

rem Falls die Zielordner noch nicht existieren, diese erzeugen.
for %%n in (%Anzahlen%) do if not exist "%Ziel%\%%n-Teiler\" md "%Ziel%\%%n-Teiler"  

rem Alle passenden Dateien im Quellordner durchgehen ...
for %%i in ("%Quelle%\%Dateien%") do (  
    
    rem ... und davon den ersten Namensbestandteil
    rem (bis zum ersten "_") betrachten  
    for /f "delims=_" %%a in ("%%~ni") do (  

        rem Ein Inhaltsverzeichnis aller Dateien mit gleichem ersten
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden - 
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer  
        rem sorgen, dass fuer den Fall, dass es keine weiteren
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler-  
        rem meldungen unterdrueckt werden.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do (  

            rem Wenn die Anzahl (%%n) in der Vorgabe (%Anzahlen%)
            rem enthalten ist (fuer den exakten Vergleich muss die
            rem ermittelte Anzahl zwischen Kommata gesetzt werden)
            rem alle Dateien mit dem gleichen Namensbeginn in den 
            rem entsprechenden Zielordner verschieben. Damit die
            rem Namen der verschobenen Dateien nicht angezeigt
            rem werden, die Ausgabe noch mit ">nul" unterdruecken.  
            echo %Anzahlen%|findstr /c:",%%n,">nul && move "%Quelle%\%%a_%Dateien%" "%Ziel%\%%n-Teiler\">nul  
        )
    )
)
Bei dieser Variante ist es wichtig, dass jede Anzahl durch Kommata eingeschlossen wird und es in der Aufzählung keine Leerzeichen gibt.
Zu Deiner anderen Frage:
Falls die Zusammenfassung nur nach der exakten Seitenzahl vorgenommen werden soll, dann etwa so:
@echo off & setlocal
rem **********************************************
rem Variable fuer Pfade, Dateimuster und Hilfs-
rem programm "APGetPageCount.exe" hier festlegen;  
rem damit wird es einfacher, den Batch anzupassen.

set "Quelle=D:\Ordner"  
set "Dateien=*.pdf"  
set "Ziel=D:\Zielordner"  
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe"  

rem **********************************************

rem Basisordner erstellen, falls noch nicht vorhanden
if not exist "%Ziel%\" md "%Ziel%"  

rem Alle passenden Dateien im Quellordner durchgehen ...
for %%i in ("%Quelle%\%Dateien%") do (  
    
    rem und deren jeweilige Seitenzahl bestimmen (steht
    rem dann in %%n), wobei die Gesamtanzahl "Total Page  
    rem Count" der Seitenanzahl der untersuchten Datei  
    rem entspricht und daher unmittelbar verwendbar ist.
	for /f "tokens=4 delims=: " %%n in ('call "%PgCt%" "%%i"^|findstr /b /c:"Total Page Count:') do (  
	
	    rem Anhand der festgestellten Seitenanzahl falls
        rem erforderlich den entsprechen Zielordner erstellen
        rem die Datei verschieben. Damit der Name der
        rem verschobenen Datei nicht angezeigt wird,
        rem die Ausgabe moch mit ">nul" unterdruecken.  
        if not exist "%Ziel%\%%n-seitig" md "%Ziel%\%%n-seitig"  
        move "%%i" "%Ziel%\%%n-seitig"\>nul  
    )
)
Grüße
bastla

[Edit] Hinzugefügtes "findstr" ermöglich Seitenanzahlermittlung nur anhand des Wertes "Total Page Count:" [/Edit]
Sternex
Sternex 31.05.2008 um 21:41:01 Uhr
Goto Top
Hallo bastla,
wahnsinn wie schnell du immer eine Lösung hast ;)
also die 1. Variante wo die Gruppen nicht vorher angegeben werden müssen ist spitze!

Zu der 2. Sache mit den Seitenzahlen. Das sollte dann allerdings auch in Verbindung mit der Trennung der Teile sein. Wenn das klappt ;)

Eigentlich geht es genau darum, das die Teile (z.B. 3-Teiler) in der z.B. eine Datei mehr wie 2 Seiten hat, in einen Unterordner des Ordners "3-Teiler" kommen der dann z.b. "3-Seiter" heißt. Scheint mir aber sehr umfangreich zu sein ;)

Viele Grüße
bastla
bastla 31.05.2008 um 22:02:40 Uhr
Goto Top
Hallo Sternex!

Soferne ich das richtig verstanden habe, würden dann am Ende alle Dateien in den jeweiligen "#-Seiter"-Ordnern liegen - falls ja, probier's mal damit:
@echo off & setlocal
rem *********************************************
rem Variable fuer Pfade, Dateimuster und Hilfs-
rem programm "APGetPageCount.exe" hier festlegen;  
rem damit wird es einfacher, den Batch anzupassen.

set "Quelle=D:\Ordner"  
set "Dateien=*.pdf"  
set "Ziel=D:\Zielordner"  
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe"  

rem *********************************************

rem Alle passenden Dateien im Quellordner durchgehen ...
for %%i in ("%Quelle%\%Dateien%") do (  
    
    rem ... und davon den ersten Namensbestandteil
    rem (bis zum ersten "_") betrachten  
    for /f "delims=_" %%a in ("%%~ni") do (  

        rem Ein Inhaltsverzeichnis aller Dateien mit gleichem ersten
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden - 
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer  
        rem sorgen, dass fuer den Fall, dass es keine weiteren
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler-  
        rem meldungen unterdrueckt werden.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do (  

            rem Anhand der festgestellten Anzahl an zusammengehoerigen
            rem Dateien falls erforderlich den entsprechen Zielordner
            rem erstellen und die Dateien verschieben. Damit die Namen
            rem  der verschobenen Dateien nicht angezeigt werden,
            rem die Ausgabe moch mit ">nul" unterdruecken.  
            if not exist "%Ziel%\%%n-Teiler" md "%Ziel%\%%n-Teiler"  
            move "%Quelle%\%%a_%Dateien%" "%Ziel%\%%n-Teiler"\>nul  
        )
    )
)

rem Nach dem Verteilen auf die "#-Teiler-Ordner"  
rem jetzt die weitere Verteilung nach Seitenzahlen

rem Dazu alle Unterordner des %Ziel%-Ordners
rem einzeln bearbeiten
for /d %%a in ("%Ziel%\*.*") do (  

    rem Fuer jede Datei des aktuellen Unterordners %%a ...
    for %%i in ("%%a\%Dateien%") do (  

        rem die Seitenanzahl (%%n) feststellen ...
        for /f "tokens=4 delims=: " %%n in ('call "%PgCt%" "%%i"^|findstr /b /c:"Total Page Count:') do (  

            rem ... und die Datei in den (ev erst zu
            rem erstellenden) Unter-Unterordner
            rem "#-Seiter" verschieben.  
            if not exist "%%a\%%n-Seiter" md "%%a\%%n-Seiter"  
            move "%%i" "%%a\%%n-Seiter\">nul  
        )
    )
)
Noch eine Anmerkung: Derzeit wird auch ein Ordner "1-Seiter" erstellt, sodass in den "#-Teiler"-Ordnern keine pdf-Dateien mehr verbleiben (aber dagegen ließe sich auch noch etwas machen face-wink).

Grüße
bastla

[Edit] Hinzugefügtes "findstr" ermöglich Seitenanzahlermittlung nur anhand des Wertes "Total Page Count:" [/Edit]
Sternex
Sternex 31.05.2008 um 22:40:19 Uhr
Goto Top
Hallo bastla,
ich glaube ich hab es nicht ausreichend erklären können was ich meinte ;)
Die Dateien die Zusammengehören sollten nicht in getrennten Ordnern sein.
Das heißt wenn von 5 Zusammengehörigen Dateien nur eine davon mehr wie 2 Seiten hat sollen alle 5 Dateien in einen Unterordner des Ordners "5 Teiler".

Falls du noch Fragen hast und es noch nicht verständlich genug ist kannst ja noch was Fragen bevor du dir die mühe machst den code zu schreiben und wir uns missverstehen face-smile

Viele Grüße
bastla
bastla 31.05.2008 um 22:46:38 Uhr
Goto Top
Hallo Sternex!

Das heißt wenn von 5 Zusammengehörigen Dateien nur eine davon mehr wie 2 Seiten hat sollen alle 5 Dateien in einen Unterordner des Ordners "5 Teiler".
Es genügt demnach die Unterscheidung "bis 2 Seiten" bzw "mehr als 2 Seiten", dafür aber dann "kollektives Verschieben"? (Auf letzteres hätte ich durch etwas mehr Mitdenken auch selbst kommen können ... face-sad)

Ist immer auf Einzeldateien abzustellen, oder wäre auch das Kriterium "Wenn Gesamtseitenanzahl eines 5-Teilers mehr als 10 beträgt, verschieben" möglich?

Grüße
bastla
Sternex
Sternex 31.05.2008 um 23:11:18 Uhr
Goto Top
Ist immer auf Einzeldateien abzustellen, oder wäre auch das Kriterium "Wenn
Gesamtseitenanzahl eines 5-Teilers mehr als 10 beträgt, verschieben" möglich?

Das wäre möglich. nur müsste das dann auch für die anderen Teile funktionieren.
bastla
bastla 01.06.2008 um 00:07:01 Uhr
Goto Top
Hallo Sternex!

Mit der Angabe der Grenze (im Beispiel: 2; muss ganzzahlig sein) wird die durchschnittliche Seitenzahl je Datei festgelegt - wenn diese überschritten erreicht wird, landet die Datei-Gruppe im Unterordner "Mehrseiter" (es erfolgt hier keine weitere Unterteilung nach Seitenanzahl) des jeweiligen "#-Teiler"-Ordners, ansonsten im Ordner "#-Teiler" selbst. Die Überprüfung erfolgt dabei anhand der Gesamtseitenzahl, da diese mit "APGetPageCount" einfach zu ermitteln ist.
@echo off & setlocal
rem *********************************************
rem Variable fuer Pfade, Dateimuster und Hilfs-
rem programm "APGetPageCount.exe" sowie Grenze  
rem fuer weitere Aufteilung nach Seitenzahlen
rem und dafuer zu erstellenden Unterordner festlegen;
rem damit wird es einfacher, den Batch anzupassen.

set "Quelle=D:\Ordner"  
set "Dateien=*.pdf"  
set "Ziel=D:\Zielordner"   
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe"  
set /a Grenze=2
set "MSeiter=Mehrseiter"  

rem *********************************************

rem Alle passenden Dateien im Quellordner durchgehen ...
for %%i in ("%Quelle%\%Dateien%") do (  
    
    rem ... und davon den ersten Namensbestandteil
    rem (bis zum ersten "_") betrachten  
    for /f "delims=_" %%a in ("%%~ni") do (  

        rem Ein Inhalteverzeichnis aller Dateien mit gleichem ersten
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden - 
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer  
        rem sorgen, dass fuer den Fall, dass es keine weiteren
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler-  
        rem meldungen unterdrueckt werden.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do (  

            rem Anhand der festgestellten Anzahl an zusammengehoerigen
            rem Dateien in Unterprogramm  ":Auswertung" die Gruppe auf  
            rem auf Gesamtseitenzahl ueberpruefen und verschieben
			call :Auswertung "%Quelle%\%%a_%Dateien%" %%n  
        )
    )
)

rem Ende Hauptprogramm
goto :eof

rem Unterprogramm
:Auswertung

rem %1 = Suchmuster der Dateigruppe (unter Anfuehrungszeichen),
rem      also zB "D:\Ordner\64123_*.pdf"  
rem %2 = Anzahl der Dateien in der Gruppe

rem Grenzwert fuer Gesamtseitenzahl anhand der zulaessigen
rem Seiten je Datei und der Anzahl der Dateien ermitteln
set /a Grenzwert=%Grenze%*%2

rem Gesamtseitenanzahl der Gruppe auslesen
for /f "tokens=4 delims=: " %%n in ('call "%PgCt%" %~1') do set /a Gesamt=%%n  

rem Ein Unterordner wird nur benoetigt, wenn die Gesamtseitenzahl
rem den Grenzwert erreicht hat
set SeitenOrdner=
if %Gesamt% geq %Grenzwert% set "SeitenOrdner=%MSeiter%"  

rem Zielordner mit Dateianzahl (%2) und ev benoetigtem
rem Unterordner "%MSeiter%" erstellen ...  
if not exist "%Ziel%\%2-Teiler\%SeitenOrdner%" md "%Ziel%\%2-Teiler\%SeitenOrdner%"  

rem ... und Dateigruppe hinein verschieben
move %1 "%Ziel%\%2-Teiler\%SeitenOrdner%">nul  

rem Ende Unterprogramm - Ruecksprung
goto :eof
Zum Testen mit einer größeren Anzahl an Dateien solltest Du vielleicht besser die abgespeckte (kommentarlose) Version benutzen:
@echo off & setlocal

set "Quelle=D:\Ordner"  
set "Dateien=*.pdf"  
set "Ziel=D:\Zielordner"  
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe"  
set /a Grenze=2
set "MSeiter=Mehrseiter"  

for %%i in ("%Quelle%\%Dateien%") do (  
    for /f "delims=_" %%a in ("%%~ni") do (  
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do (  
			call :Auswertung "%Quelle%\%%a_%Dateien%" %%n  
        )
    )
)
goto :eof

:Auswertung
set /a Grenzwert=%Grenze%*%2
for /f "tokens=4 delims=: " %%n in ('call "%PgCt%" %~1') do set /a Gesamt=%%n  
set SeitenOrdner=
if %Gesamt% geq %Grenzwert% set "SeitenOrdner=%MSeiter%"  
if not exist "%Ziel%\%2-Teiler\%SeitenOrdner%" md "%Ziel%\%2-Teiler\%SeitenOrdner%"  
move %1 "%Ziel%\%2-Teiler\%SeitenOrdner%">nul  
goto :eof
Grüße
bastla

[Edit] Seitenanzahlvergleich (%Gesamt%) von "gtr" auf "geq" geändert [/Edit]
Sternex
Sternex 01.06.2008 um 08:30:13 Uhr
Goto Top
Moin Moin,
hab gerade einmal probiert, aber es wurde in keinem Ordner der Unterordner angelegt und damit auch nix verschoben was mehr wie 2 Seiten hat.

Viele Grüße
bastla
bastla 01.06.2008 um 09:13:59 Uhr
Goto Top
Hallo Sternex!

... nix verschoben was mehr wie 2 Seiten hat.
Nur zur Sicherheit: In den "Mehrseiter"-Ordner wird nur verschoben, wenn die Seitenanzahl im Durchschnitt über 2 liegt, also wenn zB ein 3-Teiler insgesamt mehr als 6 Seiten hat (demnach würde also bei Seitenzahlen 1, 2 und 3 kein "Mehrseiter" festgestellt).
Wenn die Ordner "3-Teiler" etc erstellt und auch die Dateien dorthin verschoben wurden, muss das an der Auswertung der Seitenzahlen liegen.

Ich verwende die Version 2.2 von "APGetPageCount", welche zB für einen 3-Teiler folgende Ausgabe erzeugt:
PageCount: 4
PageCount: 4
PageCount: 2
Total Page Count: 10
Wie sieht diese Ausgabe bei Dir aus?

Da "APGetPageCount" bei der Angabe der zu prüfenden Dateien etwas "herumzickt", indem es nämlich keine Anführungszeichen erlaubt, also mit dieser Schreibweise funktioniert:
C:\Appligent\APGetPageCount\APGetPageCount.exe D:\Ordner\34123_*.pdf
aber so nicht:
C:\Appligent\APGetPageCount\APGetPageCount.exe "D:\Ordner\34123_*.pdf"  
dürfen im Pfad ("D:\Ordner") keine Leerzeichen enthalten sein, da ansonsten das (End-)Ergebnis lautet:
Total Page Count: 0
Bei dieser Gelegenheit: Enthalten die Pfade/Dateinamen bei Dir ev "!" oder andere Sonderzeichen?

Grüße
bastla

P.S.: Zur Kontrolle habe ich beide Batchversionen eben nochmals von hier heruntergeladen und erfolgreich (mit dem angegeben Quellpfad "D:\Ordner" und Dateinamen der Art "34123_1_Teil_3.pdf") getestet ...
Sternex
Sternex 01.06.2008 um 11:12:26 Uhr
Goto Top
Ups ich bin selber daran Schuld -.-

34123_1_Teil_1.pdf --> Immer 2 Seiten
34123_1_Teil_2.pdf --> Mehr wie 2 Seiten möglich
34123_1_Teil_3.pdf --> Immer 1 Seite

Somit müsste ein 3-Teiler der mehr wie 5 Seiten hat verschoben werden und nicht erst ab 6.
Das Datei _3 nur eine Seite hat, habe ich vergessen. Tut mir Leid
Dann wird es bestimmt funktionieren.

Viele Grüße
Sternex
bastla
bastla 01.06.2008 um 11:26:44 Uhr
Goto Top
Hallo Sternex!

Dazu müsste dann die Prüfung anstatt auf "größer als" einfach mit "größer oder gleich" erfolgen (damit wären bereits 6 Seiten genug).

Die Änderung in der Zeile 62 (bzw 23 in der "Kurzfassung") von "gtr" auf "geq" trage ich gleich oben ein.

Grüße
bastla
Sternex
Sternex 01.06.2008 um 11:46:59 Uhr
Goto Top
Hallo bastla,
einmal nerv ich noch ;)

So funktioniert es aber nur mit den 3-Teilern.
Im Ordner 5-Teiler z.B. ist kein Unterodner obwohl es da auch Dateien mit 3Seiten gibt.

Ist diese Funktion jetzt nur für die 3-Teiler?

Grüße Sternex
bastla
bastla 01.06.2008 um 12:16:16 Uhr
Goto Top
Hallo Sternex!

Wie schon erwähnt verwende ich die Gesamtseitenanzahl - wenn ein 5-Teiler damit auf 10 oder mehr Seiten kommt, gilt er als "Mehrseiter".

Falls es erforderlich ist, tatsächlich bereits bei Vorhandensein einer einzigen Datei aus der Gruppe mit mehr als 2 Seiten die Gruppe als "Mehrseiter" einzuordnen, lässt sich das auch machen - es war nur über die Seitensumme etwas einfacher umzusetzen.

Bei näherer Betrachtung ist es allerdings keine so große Sache face-wink:
@echo off & setlocal enabledelayedexpansion
rem "enabledelayedexpansion" erlaubt das Auslesen   
rem von in einer Schleife veraenderten/gesetzten
rem Variablen noch in dieser Schleife - benoetigt
rem fuer die Ermittlung der max. Seitenzahl

rem *********************************************
rem Variable fuer Pfade, Dateimuster und Hilfs-
rem programm "APGetPageCount.exe" sowie Grenze  
rem fuer weitere Aufteilung nach Seitenzahlen
rem und dafuer zu erstellenden Unterordner festlegen;
rem damit wird es einfacher, den Batch anzupassen.

set "Quelle=D:\Ordner"  
set "Dateien=*.pdf"  
set "Ziel=D:\Zielordner"  
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe"  

rem Festlegung der Grenze fuer Seitenzahlen;
rem Wert um 1000 erhoehen (siehe unten)
set /a Grenze=1002

set "MSeiter=Mehrseiter"  
rem *********************************************

rem Alle passenden Dateien im Quellordner durchgehen ...
for %%i in ("%Quelle%\%Dateien%") do (  

    rem ... und davon den ersten Namensbestandteil
    rem (bis zum ersten "_") betrachten  
    for /f "delims=_" %%a in ("%%~ni") do (  

        rem Ein Inhalteverzeichnis aller Dateien mit gleichem ersten
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden - 
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer  
        rem sorgen, dass fuer den Fall, dass es keine weiteren
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler-  
        rem meldungen unterdrueckt werden.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do (  

            rem Anhand der festgestellten Anzahl an zusammengehoerigen
            rem Dateien in Unterprogramm ":Auswertung" die Dateien der  
            rem Gruppe auf ihre Seitenzahl ueberpruefen und verschieben
            call :Auswertung "%Quelle%\%%a_%Dateien%" %%n  
        )
    )
)

rem Ende Hauptprogramm
goto :eof

rem Unterprogramm
:Auswertung

rem %1 = Suchmuster der Dateigruppe (unter Anfuehrungszeichen),
rem      also zB "D:\Ordner\64123_*.pdf"  
rem %2 = Anzahl der Dateien in der Gruppe

rem Variable fuer max Seitenanzahl der Gruppe initialisieren
set /a Max=0

rem Seitenanzahl jeder Datei bestimmen (dabei nur Zeilen be-
rem ruecksichtigen, welche "PageCount:" enthalten) und die  
rem hoechste Anzahl in %Max% (wegen der "delayedexpansion"  
rem !Max! geschrieben) speichern
for /f "tokens=2 delims=: " %%n in ('call "%PgCt%" %~1^|findstr /c:"PageCount:"') do set /a Seiten=%%n & if !Seiten! gtr !Max! set /a Max=!Seiten!  

rem Ein Unterordner wird nur benoetigt, wenn die hoechste
rem Seitenanzahl den Grenzwert ueberschritten hat, daher
rem zunaechst den Unterordnernamen loeschen
set SeitenOrdner=

rem Maximale Seitenanzahl um 1000 erhoehen, um (bei Bedarf)
rem leicht eine dreistellige Anzahl mit fuehrenden Nullen
rem erhalten zu koennen - zB wird aus "12" Seiten zunaechst  
rem "1012"; davon werden die letzten 3 Stellen verwendet,  
rem woraus sich "012" ergibt.  
set /a Max+=1000

rem Wenn (um 1000 erhoehter) %Max%-Wert den (ebenfalls um
rem 1000 erhoehten - siehe oben) Grenzwert uebersteigt,
rem Unterordnernamen festlegen; entweder nur allgemein
rem als "Mehrseiter" (siehe Variable %MSeiter%) ...  
if %Max% gtr %Grenze% set "SeitenOrdner=%MSeiter%"  

rem ... oder Benennung aufgrund der konkreten Seitenanzahl
rem if %Max% gtr %Grenze% set "SeitenOrdner=%Max:~-3%-Seiter"  

rem Zielordner mit Dateianzahl (%2) und ev benoetigtem
rem Unterordner "%MSeiter%" (oder 00#-Seiter) erstellen ...  
if not exist "%Ziel%\%2-Teiler\%SeitenOrdner%" md "%Ziel%\%2-Teiler\%SeitenOrdner%"  

rem ... und Dateigruppe hinein verschieben
move %1 "%Ziel%\%2-Teiler\%SeitenOrdner%">nul  

rem Ende Unterprogramm - Ruecksprung
goto :eof
Nochmals als Kurzfassung:
@echo off & setlocal enabledelayedexpansion

set "Quelle=D:\Ordner"  
set "Dateien=*.pdf"  
set "Ziel=D:\Zielordner"  
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe"  
set /a Grenze=1002
set "MSeiter=Mehrseiter"  

for %%i in ("%Quelle%\%Dateien%") do (  
    for /f "delims=_" %%a in ("%%~ni") do (  
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do (  
			call :Auswertung "%Quelle%\%%a_%Dateien%" %%n  
        )
    )
)
goto :eof

:Auswertung
set /a Max=0
for /f "tokens=2 delims=: " %%n in ('call "%PgCt%" %~1^|findstr /c:"PageCount:"') do set /a Seiten=%%n & if !Seiten! gtr !Max! set /a Max=!Seiten!  
set SeitenOrdner=
set /a Max+=1000
if %Max% gtr %Grenze% set "SeitenOrdner=%MSeiter%"  
rem if %Max% gtr %Grenze% set "SeitenOrdner=%Max:~-3%-Seiter"  
if not exist "%Ziel%\%2-Teiler\%SeitenOrdner%" md "%Ziel%\%2-Teiler\%SeitenOrdner%"  
move %1 "%Ziel%\%2-Teiler\%SeitenOrdner%">nul  
goto :eof
Jetzt wäre es auch möglich, anhand der Seitenzahl Unterordner der Art "003-Seiter" oder "012-Seiter" zu bilden - dazu einfach das "rem" am Beginn der Zeile 88 (bzw 25 in der unkommmentierten Version) entfernen.

Allerding muss ich in diesem Zusammenhang nochmals nach ev "!" in Dateinamen oder Pfad fragen, denn die würden bei diesem Ansatz (= Berücksichtigung der Einzelseitenzahl) stören ...

Grüße
bastla

[Edit] Kommentierte Fassung hinzugefügt [/Edit]
Sternex
Sternex 01.06.2008 um 21:32:22 Uhr
Goto Top
Hey,
es scheint jetz perfekt zu funktionieren und "!" ist nirgendwo im Dateiname.
Klasse! Morgen probiere ich es noch einmal mit einer großen Anzahl an Daten und dann bin ich glücklich face-smile

Viele Grüße Sternex