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 ...
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 ...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 88490
Url: https://administrator.de/contentid/88490
Ausgedruckt am: 23.11.2024 um 04:11 Uhr
44 Kommentare
Neuester Kommentar
Hallo Sternex und willkommen im Forum!
Wenn nur die beiden dargestellten Arten von Dateinamen zu unterscheiden sind, sollte das so gehen:
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
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\"
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
@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
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
@Biber
Grüße
bastla
..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
Jetzt versuche ich es mal.
Hier mein ungetesteter Code:
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
)
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
)
Dan ersetzte das
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
set nr=0
durchset 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.
... stellt sich die Frage, ob das noch als Oneliner zählt (insbesondere in der neuen Code-Darstellung ):
Die Unterscheidung erfolgt übrigens über die Bedingung "mehr als 3 Dateien" - falls das Vorhandensein von exakt 5 Dateien geprüft werden soll, müsste
auf
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
@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
@if "%n" gtr "3"
@if "%n"=="5"
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
<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 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]
@Biber
Ein Oneliner mit Kommentaren - geTuemII fände das sicher "hybsch" ...
... aber gut, sollte Sternex meine Version brauchbar finden, schreibe ich noch was dazu.
Grüße
bastla
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
Hallo Sternex!
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
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
)
)
)
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
Hallo Sternex!
Aktueller Stand wäre (um einige Details ergänzt):
Kannst Du vielleicht einige Beispiel für Dateinamen, mit denen es nicht funktioniert hat, posten?
Grüße
bastla
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
)
)
)
Grüße
bastla
Hallo Sternex!
ergänzen.
Grüße
bastla
Kann ich die Zeilen ...
Kannst Du; aber bitte daran denken, dass der Zielordner bereits existieren muss - daher auchif "%%n"=="7" @Move "%Quelle%\%%a_%Dateien%" "%Ziel7%\">nul
dann auch später noch beliebig erweitern?set "Ziel7=D:\7-Teiler"
if not exist "%Ziel7%\" md "%Ziel7%"
Grüße
bastla
... allerdings ist zum Einen die Grenze bei 9 Dateien (Begründung siehe oben) und andererseits die Schreibweise (zu den Vergleichsoperatoren siehe "if /?")
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
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
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:
Wenn weiterhin die Anzahl vorgegeben werden soll, ist schön langsam eine Auflistung der Anzahlen erforderlich:
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:
Grüße
bastla
[Edit] Hinzugefügtes "findstr" ermöglich Seitenanzahlermittlung nur anhand des Wertes "Total Page Count:" [/Edit]
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
)
)
)
@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
)
)
)
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
)
)
bastla
[Edit] Hinzugefügtes "findstr" ermöglich Seitenanzahlermittlung nur anhand des Wertes "Total Page Count:" [/Edit]
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:
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]
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
)
)
)
Grüße
bastla
[Edit] Hinzugefügtes "findstr" ermöglich Seitenanzahlermittlung nur anhand des Wertes "Total Page Count:" [/Edit]
Hallo Sternex!
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
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
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.
Zum Testen mit einer größeren Anzahl an Dateien solltest Du vielleicht besser die abgespeckte (kommentarlose) Version benutzen:
Grüße
bastla
[Edit] Seitenanzahlvergleich (%Gesamt%) von "gtr" auf "geq" geändert [/Edit]
Mit der Angabe der Grenze (im Beispiel: 2; muss ganzzahlig sein) wird die durchschnittliche Seitenzahl je Datei festgelegt - wenn diese
@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
@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
bastla
[Edit] Seitenanzahlvergleich (%Gesamt%) von "gtr" auf "geq" geändert [/Edit]
Hallo Sternex!
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:
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:
aber so nicht:
dürfen im Pfad ("D:\Ordner") keine Leerzeichen enthalten sein, da ansonsten das (End-)Ergebnis lautet:
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 ...
... 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
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
C:\Appligent\APGetPageCount\APGetPageCount.exe "D:\Ordner\34123_*.pdf"
Total Page Count: 0
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 ...
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 :
Nochmals als Kurzfassung:
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]
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 :
@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
@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
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]