Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Nur bestimmte Dateien mit Batch Script verschieben

Frage Entwicklung Batch & Shell

Mitglied: Sternex

Sternex (Level 1) - Jetzt verbinden

26.05.2008, aktualisiert 01.06.2008, 8875 Aufrufe, 44 Kommentare

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 ...
44 Antworten
Mitglied: bastla
26.05.2008 um 19:10 Uhr
Hallo Sternex und willkommen im Forum!

Wenn nur die beiden dargestellten Arten von Dateinamen zu unterscheiden sind, sollte das so gehen:
01.
@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
Bitte warten ..
Mitglied: bytecounter
26.05.2008 um 19:13 Uhr
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
Bitte warten ..
Mitglied: Biber
26.05.2008 um 19:26 Uhr
@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
Bitte warten ..
Mitglied: bastla
26.05.2008 um 19:33 Uhr
@Biber

..Wird nix mit Oneliner....
Vielleicht doch (auch wenn's mit einer Variable schöner aussähe):
01.
@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
Bitte warten ..
Mitglied: Sternex
26.05.2008 um 19:38 Uhr
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
Bitte warten ..
Mitglied: miniversum
26.05.2008 um 20:07 Uhr
Jetzt versuche ich es mal.
Hier mein ungetesteter Code:
01.
@echo off 
02.
set "ordner=C:\Dateien" 
03.
set lastfile="" 
04.
set nr=0 
05.
 
06.
FOR /F "delims=" %%i in ('dir /B "%ordner%\*.pdf"') do call:dofile "%%~i" 
07.
goto:eof 
08.
 
09.
:dofile 
10.
set name=%~n1 
11.
if "%name:~-1%" equ "%lastfile%" ( 
12.
set /a nr=%nr%+1 
13.
) else ( 
14.
md "%ordner%\Teil %nr%" 2>NUL 
15.
copy "%ordner%\%lastfile%*.pdf" "%ordner%\Teil %nr%"  
16.
set nr=0 
17.
)
Bitte warten ..
Mitglied: Sternex
26.05.2008 um 20:20 Uhr
@ 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 aber vll wird das ja noch? ;) danke schonmal
Bitte warten ..
Mitglied: miniversum
26.05.2008 um 20:34 Uhr
Korrektur:
01.
@echo off 
02.
set "ordner=C:\Dateien" 
03.
set "lastfile=" 
04.
set nr=0 
05.
 
06.
FOR /F "delims=" %%i in ('dir /B "%ordner%\*.pdf"') do call:dofile "%%~i" 
07.
goto:eof 
08.
 
09.
:dofile 
10.
FOR /F "tokens=1 delims=_" %%i in ('echo %~1')do set "name=%%i" 
11.
if "%name%" equ "%lastfile%" ( 
12.
set /a nr=%nr%+1 
13.
) else ( 
14.
md "%ordner%\Teil %nr%" 2>NUL 
15.
copy "%ordner%\%lastfile%*.pdf" "%ordner%\Teil %nr%"  
16.
set "lastfile=%name%" 
17.
set nr=0 
18.
)
Bitte warten ..
Mitglied: Sternex
26.05.2008 um 20:54 Uhr
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
Bitte warten ..
Mitglied: miniversum
26.05.2008 um 21:09 Uhr
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.
Bitte warten ..
Mitglied: bastla
26.05.2008 um 21:11 Uhr
... stellt sich die Frage, ob das noch als Oneliner zählt (insbesondere in der neuen Code-Darstellung ):
01.
@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
01.
@if "%n" gtr "3"
auf
01.
@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 ...

Grüße
bastla
Bitte warten ..
Mitglied: Sternex
26.05.2008 um 21:16 Uhr
Leider noch nicht ganz.

Bei der Änderung wird alles einfach in den Ordner "Teil 0" kopiert und der Ordner "Teil 4" bleibt leer.
Bitte warten ..
Mitglied: Biber
26.05.2008 um 21:38 Uhr
<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]
Bitte warten ..
Mitglied: bastla
26.05.2008 um 21:44 Uhr
@Biber

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

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
Bitte warten ..
Mitglied: Sternex
26.05.2008 um 21:56 Uhr
@ 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?
Bitte warten ..
Mitglied: bastla
26.05.2008 um 22:26 Uhr
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:
01.
@echo off & setlocal 
02.
rem *************************************************** 
03.
rem Variable fuer Pfade und Dateimuster hier festlegen; 
04.
rem damit wird es einfacher, den Batch anzupassen. 
05.
 
06.
set "Quelle=D:\Ordner" 
07.
set "Dateien=*.pdf" 
08.
set "Ziel=D:\5-Teiler" 
09.
 
10.
rem *************************************************** 
11.
 
12.
rem Falls der Zielordner noch nicht existiert, diesen erzeugen. 
13.
if not exist "%Ziel%\" md "%Ziel%" 
14.
 
15.
rem Alle passenden Dateien im Quellordner durchgehen ... 
16.
for %%i in ("%Quelle%\%Dateien%") do ( 
17.
     
18.
    rem ... und davon den ersten Bestandteil (bis zum 
19.
    rem ersten "_") nur des Dateinamens (%%~ni) betrachten. 
20.
    for /f "delims=_" %%a in ("%%~ni") do ( 
21.
 
22.
        rem Ein Inhaltsverzeichnis aller Dateien mit gleichem ersten 
23.
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die 
24.
        rem Zeile mit der Anzahl der gefundenen Dateien - erkennbar 
25.
        rem am Bestandteil "Datei(en)" - verwenden und noch dafuer 
26.
        rem sorgen, dass fuer den Fall, dass es keine weiteren 
27.
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler- 
28.
        rem meldungen unterdrueckt werden. 
29.
        for /f %%n in ('dir "%Quelle%\%%a%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do ( 
30.
 
31.
            rem Wenn die Anzahl mehr als 3 betraegt, alle Dateien mit 
32.
            rem dem gleichen Namensbeginn in den Zielordner ver- 
33.
            rem schieben. Damit die Namen der verschobenen Dateien 
34.
            rem nicht angezeigt werden, ">nul" verwenden. 
35.
            if "%%n" gtr "3" @move "%Quelle%\%%a%Dateien%" "%Ziel%\">nul 
36.
37.
38.
)
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
Bitte warten ..
Mitglied: Sternex
26.05.2008 um 22:35 Uhr
Vielen Dank für die schnelle Hilfe Auch an den Rest der mir geholfen hat.
Klappt wunderbar so

Grüße Sternex
Bitte warten ..
Mitglied: geTuemII
26.05.2008 um 22:50 Uhr
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...

Beeindruckt,
geTuemII
Bitte warten ..
Mitglied: bastla
26.05.2008 um 22:58 Uhr
Hallo geTuemII!

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

Grüße
bastla
Bitte warten ..
Mitglied: geTuemII
26.05.2008 um 23:05 Uhr
<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 Hab ich IMHO damals mit meiner Großmutter gesehen... Nich daß du glaubst, ich wäre schon so alt.

geTuemII
Bitte warten ..
Mitglied: bastla
26.05.2008 um 23:10 Uhr
... Ihr habt damals auch schon Songs gesehen? Dann kann's ja nicht sooo lange her sein ...

bastla
Bitte warten ..
Mitglied: geTuemII
27.05.2008 um 00:11 Uhr
Das verwechselst du mit MTV. Nein, das meinte ich nicht. Ich meine etwas, das (wenn ich micht recht entsinne, hieß das Filmmusical)

geTuemII
Bitte warten ..
Mitglied: Sternex
27.05.2008 um 19:12 Uhr
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:
01.
@echo off & setlocal 
02.
rem ********************************************* 
03.
rem Variable fuer Pfade und Dateimuster hier festlegen; 
04.
rem damit wird es einfacher, den Batch anzupassen. 
05.
set "Quelle=D:\Daten" 
06.
set "Dateien=*.pdf" 
07.
set "Ziel=D:\Daten\5-Teiler" 
08.
rem ********************************************* 
09.
 
10.
rem Falls der Zielordner noch nicht existiert, diesen erzeugen. 
11.
if not exist "%Ziel%\" md "%Ziel%" 
12.
 
13.
rem Alle passenden Dateien im Quellordner durchgehen ... 
14.
for %%i in ("%Quelle%\%Dateien%") do ( 
15.
     
16.
    rem ... und davon den ersten Namensbestandteil 
17.
    rem (bis zum ersten "_") betrachten 
18.
    for /f "delims=_" %%a in ("%%~ni") do ( 
19.
 
20.
        rem Ein Inhalteverzeichnis aller Dateien mit gleichem ersten 
21.
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die 
22.
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden -  
23.
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafür sorgen, 
24.
        rem dass für den Fall, dass es keine weiteren zugehoerigen Dateien 
25.
        rem gibt, mittels "2>nul" Fehlermeldungen unterdrueckt werden. 
26.
        for /f %%n in ('dir "%Quelle%\%%a%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do ( 
27.
 
28.
            rem Wenn die Anzahl mehr als 3 betraegt, alle Dateien mit 
29.
            rem dem gleichen Namensbeginn in den Zielordner verschieben. 
30.
            rem Damit die Namen der verschobenen Dateien nicht angezeigt 
31.
            rem werden, die Ausgabe mit ">nul" unterdruecken. 
32.
            if "%%n" gtr "3" @move "%Quelle%\%%a%Dateien%" "%Ziel%\">nul 
33.
34.
35.
)
Bitte warten ..
Mitglied: bastla
27.05.2008 um 20:51 Uhr
Hallo Sternex!

Aktueller Stand wäre (um einige Details ergänzt):
01.
@echo off & setlocal 
02.
rem ********************************************* 
03.
rem Variable fuer Pfade und Dateimuster hier festlegen; 
04.
rem damit wird es einfacher, den Batch anzupassen. 
05.
 
06.
set "Quelle=D:\Ordner" 
07.
set "Dateien=*.pdf" 
08.
set "Ziel5=D:\5-Teiler" 
09.
set "Ziel7=D:\7-Teiler" 
10.
 
11.
rem ********************************************* 
12.
 
13.
rem Falls die Zielordner noch nicht existieren, diese erzeugen. 
14.
if not exist "%Ziel5%\" md "%Ziel5%" 
15.
if not exist "%Ziel7%\" md "%Ziel7%" 
16.
 
17.
rem Alle passenden Dateien im Quellordner durchgehen ... 
18.
for %%i in ("%Quelle%\%Dateien%") do ( 
19.
     
20.
    rem ... und davon den ersten Namensbestandteil 
21.
    rem (bis zum ersten "_") betrachten 
22.
    for /f "delims=_" %%a in ("%%~ni") do ( 
23.
 
24.
        rem Ein Inhaltsverzeichnis aller Dateien mit gleichem ersten 
25.
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die 
26.
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden -  
27.
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer 
28.
        rem sorgen, dass fuer den Fall, dass es keine weiteren 
29.
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler- 
30.
        rem meldungen unterdrueckt werden. 
31.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do ( 
32.
 
33.
            rem Wenn die Anzahl 5 bzw 7 betraegt, alle Dateien mit 
34.
            rem dem gleichen Namensbeginn in den jeweiligen Zielordner 
35.
            rem verschieben. Damit die Namen der verschobenen Dateien 
36.
            rem nicht angezeigt werden, die Ausgabe moch mit ">nul" 
37.
            rem unterdruecken. 
38.
            if "%%n"=="5" move "%Quelle%\%%a_%Dateien%" "%Ziel5%\">nul 
39.
            if "%%n"=="7" move "%Quelle%\%%a_%Dateien%" "%Ziel7%\">nul 
40.
41.
42.
)
Kannst Du vielleicht einige Beispiel für Dateinamen, mit denen es nicht funktioniert hat, posten?

Grüße
bastla
Bitte warten ..
Mitglied: Sternex
27.05.2008 um 21:01 Uhr
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 ...
01.
if "%%n"=="7" @move "%Quelle%\%%a_%Dateien%" "%Ziel7%\">nul 
dann auch später noch beliebig erweitern?
Bitte warten ..
Mitglied: bastla
27.05.2008 um 21:35 Uhr
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
01.
set "Ziel7=D:\7-Teiler" 
02.
if not exist "%Ziel7%\" md "%Ziel7%"
ergänzen.

Grüße
bastla
Bitte warten ..
Mitglied: Sternex
27.05.2008 um 21:43 Uhr
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!
Bitte warten ..
Mitglied: bastla
27.05.2008 um 21:48 Uhr
... allerdings ist zum Einen die Grenze bei 9 Dateien (Begründung siehe oben) und andererseits die Schreibweise (zu den Vergleichsoperatoren siehe "if /?")
01.
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
Bitte warten ..
Mitglied: Sternex
27.05.2008 um 22:00 Uhr
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
Bitte warten ..
Mitglied: Sternex
31.05.2008 um 17:23 Uhr
Halli Hallo,
also ich bin sehr zufrieden mit dem Script 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
Bitte warten ..
Mitglied: bastla
31.05.2008 um 20:08 Uhr
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:
01.
@echo off & setlocal 
02.
rem ********************************************** 
03.
rem Variable fuer Pfade und Dateimuster hier festlegen; 
04.
rem damit wird es einfacher, den Batch anzupassen. 
05.
 
06.
set "Quelle=D:\Ordner" 
07.
set "Dateien=*.pdf" 
08.
set "Ziel=D:\Zielordner" 
09.
 
10.
rem ********************************************** 
11.
 
12.
rem Alle passenden Dateien im Quellordner durchgehen ... 
13.
for %%i in ("%Quelle%\%Dateien%") do ( 
14.
     
15.
    rem ... und davon den ersten Namensbestandteil 
16.
    rem (bis zum ersten "_") betrachten 
17.
    for /f "delims=_" %%a in ("%%~ni") do ( 
18.
 
19.
        rem Ein Inhaltsverzeichnis aller Dateien mit gleichem ersten 
20.
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die 
21.
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden -  
22.
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer 
23.
        rem sorgen, dass fuer den Fall, dass es keine weiteren 
24.
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler- 
25.
        rem meldungen unterdrueckt werden. 
26.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do ( 
27.
 
28.
            rem Anhand der festgestellten Anzahl an zusammengehoerigen 
29.
            rem Dateien falls erforderlich den entsprechen Zielordner 
30.
            rem erstellen und die Dateien verschieben. Damit die Namen 
31.
            rem  der verschobenen Dateien nicht angezeigt werden, 
32.
            rem die Ausgabe noch mit ">nul" unterdruecken. 
33.
			if not exist "%Ziel%\%%n-Teiler" md "%Ziel%\%%n-Teiler" 
34.
            move "%Quelle%\%%a_%Dateien%" "%Ziel%\%%n-Teiler"\>nul 
35.
36.
37.
)
Wenn weiterhin die Anzahl vorgegeben werden soll, ist schön langsam eine Auflistung der Anzahlen erforderlich:
01.
@echo off & setlocal 
02.
rem ********************************************** 
03.
rem Variable fuer Pfade und Dateimuster sowie die 
04.
rem zusammenzufassenden Anzahl-Gruppen festlegen; 
05.
rem damit wird es einfacher, den Batch anzupassen. 
06.
 
07.
set "Quelle=D:\Ordner" 
08.
set "Dateien=*.pdf" 
09.
set "Ziel=D:\Zielordner" 
10.
set "Anzahlen=,12,11,10,9,7,5,3," 
11.
 
12.
rem ********************************************** 
13.
 
14.
rem Falls die Zielordner noch nicht existieren, diese erzeugen. 
15.
for %%n in (%Anzahlen%) do if not exist "%Ziel%\%%n-Teiler\" md "%Ziel%\%%n-Teiler" 
16.
 
17.
rem Alle passenden Dateien im Quellordner durchgehen ... 
18.
for %%i in ("%Quelle%\%Dateien%") do ( 
19.
     
20.
    rem ... und davon den ersten Namensbestandteil 
21.
    rem (bis zum ersten "_") betrachten 
22.
    for /f "delims=_" %%a in ("%%~ni") do ( 
23.
 
24.
        rem Ein Inhaltsverzeichnis aller Dateien mit gleichem ersten 
25.
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die 
26.
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden -  
27.
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer 
28.
        rem sorgen, dass fuer den Fall, dass es keine weiteren 
29.
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler- 
30.
        rem meldungen unterdrueckt werden. 
31.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do ( 
32.
 
33.
            rem Wenn die Anzahl (%%n) in der Vorgabe (%Anzahlen%) 
34.
            rem enthalten ist (fuer den exakten Vergleich muss die 
35.
            rem ermittelte Anzahl zwischen Kommata gesetzt werden) 
36.
            rem alle Dateien mit dem gleichen Namensbeginn in den  
37.
            rem entsprechenden Zielordner verschieben. Damit die 
38.
            rem Namen der verschobenen Dateien nicht angezeigt 
39.
            rem werden, die Ausgabe noch mit ">nul" unterdruecken. 
40.
            echo %Anzahlen%|findstr /c:",%%n,">nul && move "%Quelle%\%%a_%Dateien%" "%Ziel%\%%n-Teiler\">nul 
41.
42.
43.
)
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:
01.
@echo off & setlocal 
02.
rem ********************************************** 
03.
rem Variable fuer Pfade, Dateimuster und Hilfs- 
04.
rem programm "APGetPageCount.exe" hier festlegen; 
05.
rem damit wird es einfacher, den Batch anzupassen. 
06.
 
07.
set "Quelle=D:\Ordner" 
08.
set "Dateien=*.pdf" 
09.
set "Ziel=D:\Zielordner" 
10.
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe" 
11.
 
12.
rem ********************************************** 
13.
 
14.
rem Basisordner erstellen, falls noch nicht vorhanden 
15.
if not exist "%Ziel%\" md "%Ziel%" 
16.
 
17.
rem Alle passenden Dateien im Quellordner durchgehen ... 
18.
for %%i in ("%Quelle%\%Dateien%") do ( 
19.
     
20.
    rem und deren jeweilige Seitenzahl bestimmen (steht 
21.
    rem dann in %%n), wobei die Gesamtanzahl "Total Page 
22.
    rem Count" der Seitenanzahl der untersuchten Datei 
23.
    rem entspricht und daher unmittelbar verwendbar ist. 
24.
	for /f "tokens=4 delims=: " %%n in ('call "%PgCt%" "%%i"^|findstr /b /c:"Total Page Count:') do ( 
25.
	 
26.
	    rem Anhand der festgestellten Seitenanzahl falls 
27.
        rem erforderlich den entsprechen Zielordner erstellen 
28.
        rem die Datei verschieben. Damit der Name der 
29.
        rem verschobenen Datei nicht angezeigt wird, 
30.
        rem die Ausgabe moch mit ">nul" unterdruecken. 
31.
        if not exist "%Ziel%\%%n-seitig" md "%Ziel%\%%n-seitig" 
32.
        move "%%i" "%Ziel%\%%n-seitig"\>nul 
33.
34.
)
Grüße
bastla

[Edit] Hinzugefügtes "findstr" ermöglich Seitenanzahlermittlung nur anhand des Wertes "Total Page Count:" [/Edit]
Bitte warten ..
Mitglied: Sternex
31.05.2008 um 21:41 Uhr
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
Bitte warten ..
Mitglied: bastla
31.05.2008 um 22:02 Uhr
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:
01.
@echo off & setlocal 
02.
rem ********************************************* 
03.
rem Variable fuer Pfade, Dateimuster und Hilfs- 
04.
rem programm "APGetPageCount.exe" hier festlegen; 
05.
rem damit wird es einfacher, den Batch anzupassen. 
06.
 
07.
set "Quelle=D:\Ordner" 
08.
set "Dateien=*.pdf" 
09.
set "Ziel=D:\Zielordner" 
10.
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe" 
11.
 
12.
rem ********************************************* 
13.
 
14.
rem Alle passenden Dateien im Quellordner durchgehen ... 
15.
for %%i in ("%Quelle%\%Dateien%") do ( 
16.
     
17.
    rem ... und davon den ersten Namensbestandteil 
18.
    rem (bis zum ersten "_") betrachten 
19.
    for /f "delims=_" %%a in ("%%~ni") do ( 
20.
 
21.
        rem Ein Inhaltsverzeichnis aller Dateien mit gleichem ersten 
22.
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die 
23.
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden -  
24.
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer 
25.
        rem sorgen, dass fuer den Fall, dass es keine weiteren 
26.
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler- 
27.
        rem meldungen unterdrueckt werden. 
28.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do ( 
29.
 
30.
            rem Anhand der festgestellten Anzahl an zusammengehoerigen 
31.
            rem Dateien falls erforderlich den entsprechen Zielordner 
32.
            rem erstellen und die Dateien verschieben. Damit die Namen 
33.
            rem  der verschobenen Dateien nicht angezeigt werden, 
34.
            rem die Ausgabe moch mit ">nul" unterdruecken. 
35.
            if not exist "%Ziel%\%%n-Teiler" md "%Ziel%\%%n-Teiler" 
36.
            move "%Quelle%\%%a_%Dateien%" "%Ziel%\%%n-Teiler"\>nul 
37.
38.
39.
40.
 
41.
rem Nach dem Verteilen auf die "#-Teiler-Ordner" 
42.
rem jetzt die weitere Verteilung nach Seitenzahlen 
43.
 
44.
rem Dazu alle Unterordner des %Ziel%-Ordners 
45.
rem einzeln bearbeiten 
46.
for /d %%a in ("%Ziel%\*.*") do ( 
47.
 
48.
    rem Fuer jede Datei des aktuellen Unterordners %%a ... 
49.
    for %%i in ("%%a\%Dateien%") do ( 
50.
 
51.
        rem die Seitenanzahl (%%n) feststellen ... 
52.
        for /f "tokens=4 delims=: " %%n in ('call "%PgCt%" "%%i"^|findstr /b /c:"Total Page Count:') do ( 
53.
 
54.
            rem ... und die Datei in den (ev erst zu 
55.
            rem erstellenden) Unter-Unterordner 
56.
            rem "#-Seiter" verschieben. 
57.
            if not exist "%%a\%%n-Seiter" md "%%a\%%n-Seiter" 
58.
            move "%%i" "%%a\%%n-Seiter\">nul 
59.
60.
61.
)
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 ).

Grüße
bastla

[Edit] Hinzugefügtes "findstr" ermöglich Seitenanzahlermittlung nur anhand des Wertes "Total Page Count:" [/Edit]
Bitte warten ..
Mitglied: Sternex
31.05.2008 um 22:40 Uhr
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

Viele Grüße
Bitte warten ..
Mitglied: bastla
31.05.2008 um 22:46 Uhr
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 ... )

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
Bitte warten ..
Mitglied: Sternex
31.05.2008 um 23:11 Uhr
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.
Bitte warten ..
Mitglied: bastla
01.06.2008 um 00:07 Uhr
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.
01.
@echo off & setlocal 
02.
rem ********************************************* 
03.
rem Variable fuer Pfade, Dateimuster und Hilfs- 
04.
rem programm "APGetPageCount.exe" sowie Grenze 
05.
rem fuer weitere Aufteilung nach Seitenzahlen 
06.
rem und dafuer zu erstellenden Unterordner festlegen; 
07.
rem damit wird es einfacher, den Batch anzupassen. 
08.
 
09.
set "Quelle=D:\Ordner" 
10.
set "Dateien=*.pdf" 
11.
set "Ziel=D:\Zielordner"  
12.
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe" 
13.
set /a Grenze=2 
14.
set "MSeiter=Mehrseiter" 
15.
 
16.
rem ********************************************* 
17.
 
18.
rem Alle passenden Dateien im Quellordner durchgehen ... 
19.
for %%i in ("%Quelle%\%Dateien%") do ( 
20.
     
21.
    rem ... und davon den ersten Namensbestandteil 
22.
    rem (bis zum ersten "_") betrachten 
23.
    for /f "delims=_" %%a in ("%%~ni") do ( 
24.
 
25.
        rem Ein Inhalteverzeichnis aller Dateien mit gleichem ersten 
26.
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die 
27.
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden -  
28.
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer 
29.
        rem sorgen, dass fuer den Fall, dass es keine weiteren 
30.
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler- 
31.
        rem meldungen unterdrueckt werden. 
32.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do ( 
33.
 
34.
            rem Anhand der festgestellten Anzahl an zusammengehoerigen 
35.
            rem Dateien in Unterprogramm  ":Auswertung" die Gruppe auf 
36.
            rem auf Gesamtseitenzahl ueberpruefen und verschieben 
37.
			call :Auswertung "%Quelle%\%%a_%Dateien%" %%n 
38.
39.
40.
41.
 
42.
rem Ende Hauptprogramm 
43.
goto :eof 
44.
 
45.
rem Unterprogramm 
46.
:Auswertung 
47.
 
48.
rem %1 = Suchmuster der Dateigruppe (unter Anfuehrungszeichen), 
49.
rem      also zB "D:\Ordner\64123_*.pdf" 
50.
rem %2 = Anzahl der Dateien in der Gruppe 
51.
 
52.
rem Grenzwert fuer Gesamtseitenzahl anhand der zulaessigen 
53.
rem Seiten je Datei und der Anzahl der Dateien ermitteln 
54.
set /a Grenzwert=%Grenze%*%2 
55.
 
56.
rem Gesamtseitenanzahl der Gruppe auslesen 
57.
for /f "tokens=4 delims=: " %%n in ('call "%PgCt%" %~1') do set /a Gesamt=%%n 
58.
 
59.
rem Ein Unterordner wird nur benoetigt, wenn die Gesamtseitenzahl 
60.
rem den Grenzwert erreicht hat 
61.
set SeitenOrdner= 
62.
if %Gesamt% geq %Grenzwert% set "SeitenOrdner=%MSeiter%" 
63.
 
64.
rem Zielordner mit Dateianzahl (%2) und ev benoetigtem 
65.
rem Unterordner "%MSeiter%" erstellen ... 
66.
if not exist "%Ziel%\%2-Teiler\%SeitenOrdner%" md "%Ziel%\%2-Teiler\%SeitenOrdner%" 
67.
 
68.
rem ... und Dateigruppe hinein verschieben 
69.
move %1 "%Ziel%\%2-Teiler\%SeitenOrdner%">nul 
70.
 
71.
rem Ende Unterprogramm - Ruecksprung 
72.
goto :eof
Zum Testen mit einer größeren Anzahl an Dateien solltest Du vielleicht besser die abgespeckte (kommentarlose) Version benutzen:
01.
@echo off & setlocal 
02.
 
03.
set "Quelle=D:\Ordner" 
04.
set "Dateien=*.pdf" 
05.
set "Ziel=D:\Zielordner" 
06.
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe" 
07.
set /a Grenze=2 
08.
set "MSeiter=Mehrseiter" 
09.
 
10.
for %%i in ("%Quelle%\%Dateien%") do ( 
11.
    for /f "delims=_" %%a in ("%%~ni") do ( 
12.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do ( 
13.
			call :Auswertung "%Quelle%\%%a_%Dateien%" %%n 
14.
15.
16.
17.
goto :eof 
18.
 
19.
:Auswertung 
20.
set /a Grenzwert=%Grenze%*%2 
21.
for /f "tokens=4 delims=: " %%n in ('call "%PgCt%" %~1') do set /a Gesamt=%%n 
22.
set SeitenOrdner= 
23.
if %Gesamt% geq %Grenzwert% set "SeitenOrdner=%MSeiter%" 
24.
if not exist "%Ziel%\%2-Teiler\%SeitenOrdner%" md "%Ziel%\%2-Teiler\%SeitenOrdner%" 
25.
move %1 "%Ziel%\%2-Teiler\%SeitenOrdner%">nul 
26.
goto :eof
Grüße
bastla

[Edit] Seitenanzahlvergleich (%Gesamt%) von "gtr" auf "geq" geändert [/Edit]
Bitte warten ..
Mitglied: Sternex
01.06.2008 um 08:30 Uhr
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
Bitte warten ..
Mitglied: bastla
01.06.2008 um 09:13 Uhr
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:
01.
PageCount: 4 
02.
PageCount: 4 
03.
PageCount: 2 
04.
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:
01.
C:\Appligent\APGetPageCount\APGetPageCount.exe D:\Ordner\34123_*.pdf
aber so nicht:
01.
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:
01.
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 ...
Bitte warten ..
Mitglied: Sternex
01.06.2008 um 11:12 Uhr
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
Bitte warten ..
Mitglied: bastla
01.06.2008 um 11:26 Uhr
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
Bitte warten ..
Mitglied: Sternex
01.06.2008 um 11:46 Uhr
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
Bitte warten ..
Mitglied: bastla
01.06.2008 um 12:16 Uhr
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 :
01.
@echo off & setlocal enabledelayedexpansion 
02.
rem "enabledelayedexpansion" erlaubt das Auslesen  
03.
rem von in einer Schleife veraenderten/gesetzten 
04.
rem Variablen noch in dieser Schleife - benoetigt 
05.
rem fuer die Ermittlung der max. Seitenzahl 
06.
 
07.
rem ********************************************* 
08.
rem Variable fuer Pfade, Dateimuster und Hilfs- 
09.
rem programm "APGetPageCount.exe" sowie Grenze 
10.
rem fuer weitere Aufteilung nach Seitenzahlen 
11.
rem und dafuer zu erstellenden Unterordner festlegen; 
12.
rem damit wird es einfacher, den Batch anzupassen. 
13.
 
14.
set "Quelle=D:\Ordner" 
15.
set "Dateien=*.pdf" 
16.
set "Ziel=D:\Zielordner" 
17.
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe" 
18.
 
19.
rem Festlegung der Grenze fuer Seitenzahlen; 
20.
rem Wert um 1000 erhoehen (siehe unten) 
21.
set /a Grenze=1002 
22.
 
23.
set "MSeiter=Mehrseiter" 
24.
rem ********************************************* 
25.
 
26.
rem Alle passenden Dateien im Quellordner durchgehen ... 
27.
for %%i in ("%Quelle%\%Dateien%") do ( 
28.
 
29.
    rem ... und davon den ersten Namensbestandteil 
30.
    rem (bis zum ersten "_") betrachten 
31.
    for /f "delims=_" %%a in ("%%~ni") do ( 
32.
 
33.
        rem Ein Inhalteverzeichnis aller Dateien mit gleichem ersten 
34.
        rem Teil des Namens (%%a) ausgeben, allerdings davon nur die 
35.
        rem Zeile mit der Anzahl der gefundenen Dateien verwenden -  
36.
        rem erkennbar am Bestandteil "Datei(en)" - und noch dafuer 
37.
        rem sorgen, dass fuer den Fall, dass es keine weiteren 
38.
        rem zugehoerigen Dateien gibt, mittels "2>nul" Fehler- 
39.
        rem meldungen unterdrueckt werden. 
40.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do ( 
41.
 
42.
            rem Anhand der festgestellten Anzahl an zusammengehoerigen 
43.
            rem Dateien in Unterprogramm ":Auswertung" die Dateien der 
44.
            rem Gruppe auf ihre Seitenzahl ueberpruefen und verschieben 
45.
            call :Auswertung "%Quelle%\%%a_%Dateien%" %%n 
46.
47.
48.
49.
 
50.
rem Ende Hauptprogramm 
51.
goto :eof 
52.
 
53.
rem Unterprogramm 
54.
:Auswertung 
55.
 
56.
rem %1 = Suchmuster der Dateigruppe (unter Anfuehrungszeichen), 
57.
rem      also zB "D:\Ordner\64123_*.pdf" 
58.
rem %2 = Anzahl der Dateien in der Gruppe 
59.
 
60.
rem Variable fuer max Seitenanzahl der Gruppe initialisieren 
61.
set /a Max=0 
62.
 
63.
rem Seitenanzahl jeder Datei bestimmen (dabei nur Zeilen be- 
64.
rem ruecksichtigen, welche "PageCount:" enthalten) und die 
65.
rem hoechste Anzahl in %Max% (wegen der "delayedexpansion" 
66.
rem !Max! geschrieben) speichern 
67.
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! 
68.
 
69.
rem Ein Unterordner wird nur benoetigt, wenn die hoechste 
70.
rem Seitenanzahl den Grenzwert ueberschritten hat, daher 
71.
rem zunaechst den Unterordnernamen loeschen 
72.
set SeitenOrdner= 
73.
 
74.
rem Maximale Seitenanzahl um 1000 erhoehen, um (bei Bedarf) 
75.
rem leicht eine dreistellige Anzahl mit fuehrenden Nullen 
76.
rem erhalten zu koennen - zB wird aus "12" Seiten zunaechst 
77.
rem "1012"; davon werden die letzten 3 Stellen verwendet, 
78.
rem woraus sich "012" ergibt. 
79.
set /a Max+=1000 
80.
 
81.
rem Wenn (um 1000 erhoehter) %Max%-Wert den (ebenfalls um 
82.
rem 1000 erhoehten - siehe oben) Grenzwert uebersteigt, 
83.
rem Unterordnernamen festlegen; entweder nur allgemein 
84.
rem als "Mehrseiter" (siehe Variable %MSeiter%) ... 
85.
if %Max% gtr %Grenze% set "SeitenOrdner=%MSeiter%" 
86.
 
87.
rem ... oder Benennung aufgrund der konkreten Seitenanzahl 
88.
rem if %Max% gtr %Grenze% set "SeitenOrdner=%Max:~-3%-Seiter" 
89.
 
90.
rem Zielordner mit Dateianzahl (%2) und ev benoetigtem 
91.
rem Unterordner "%MSeiter%" (oder 00#-Seiter) erstellen ... 
92.
if not exist "%Ziel%\%2-Teiler\%SeitenOrdner%" md "%Ziel%\%2-Teiler\%SeitenOrdner%" 
93.
 
94.
rem ... und Dateigruppe hinein verschieben 
95.
move %1 "%Ziel%\%2-Teiler\%SeitenOrdner%">nul 
96.
 
97.
rem Ende Unterprogramm - Ruecksprung 
98.
goto :eof
Nochmals als Kurzfassung:
01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
set "Quelle=D:\Ordner" 
04.
set "Dateien=*.pdf" 
05.
set "Ziel=D:\Zielordner" 
06.
set "PgCt=C:\Appligent\APGetPageCount\APGetPageCount.exe" 
07.
set /a Grenze=1002 
08.
set "MSeiter=Mehrseiter" 
09.
 
10.
for %%i in ("%Quelle%\%Dateien%") do ( 
11.
    for /f "delims=_" %%a in ("%%~ni") do ( 
12.
        for /f %%n in ('dir /a-d "%Quelle%\%%a_%Dateien%" 2^>nul^|findstr "Datei(en)" 2^>nul') do ( 
13.
			call :Auswertung "%Quelle%\%%a_%Dateien%" %%n 
14.
15.
16.
17.
goto :eof 
18.
 
19.
:Auswertung 
20.
set /a Max=0 
21.
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! 
22.
set SeitenOrdner= 
23.
set /a Max+=1000 
24.
if %Max% gtr %Grenze% set "SeitenOrdner=%MSeiter%" 
25.
rem if %Max% gtr %Grenze% set "SeitenOrdner=%Max:~-3%-Seiter" 
26.
if not exist "%Ziel%\%2-Teiler\%SeitenOrdner%" md "%Ziel%\%2-Teiler\%SeitenOrdner%" 
27.
move %1 "%Ziel%\%2-Teiler\%SeitenOrdner%">nul 
28.
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]
Bitte warten ..
Mitglied: Sternex
01.06.2008 um 21:32 Uhr
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

Viele Grüße Sternex
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...