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

Batch mit For Schleife - gestaffelt nach Anzahl von Files in einem Verzeichnis

Frage Entwicklung Batch & Shell

Mitglied: kasimodo

kasimodo (Level 1) - Jetzt verbinden

23.06.2009, aktualisiert 23:58 Uhr, 3250 Aufrufe, 5 Kommentare

Ein freundliches "Hallo" und mein erster Dank für das Lesen meiner Frage!
von Kasimodo

Mit dem Tool PDFTK möchte ich viele PDF zusammenführen (merge)!

Syntax beispiel:
pdftk 1.pdf 2.pdf 3.pdf cat output neu_Seitenzahl.pdf
or (Using Wildcards):
pdftk *.pdf cat output neu_seitenzahl.pdf

Ausgangssituation:

Im Verzeichnis ist eine unbekannte Anzahl von PDFs. (von 1 bis ?) Alle haben einen willkürlichen Dateiname.
Sortiert nach Erstellung (Datum/Zeit) sollen immer 20 PDFs zu einer zusammengefasst werden, eine laufende Nummer und die Anzahl der Seiten sollen an die neue PDFdateinamen angefügt werden.

Beispiel 1:
106 PDFs im Verzeichnis C:\A sollen zusammengefasst werden zu 5 Dateien zu je 20 und einer mit 6.
A_1_020.pdf
A_2_020.pdf
A_3_020.pdf
A_4_020.pdf
A_5_020.pdf
A_6_006.pdf

Beispiel 2:
18 PDFs im Verzeichnis C:\A soll zu A_018.pdf werden.

Wie kann man diese 20er Schleife und den Rest (weniger als 20) realisieren?

Danke für jegliche Hilfe!

kasimodo
Mitglied: LotPings
24.06.2009 um 11:55 Uhr
Hallo Kasimodo,

leider schreibst du nicht in welcher Umgebung das laufen soll.
Das könnte der Beschreibung nach genauso Linux wie Windows sein.

Weil mich das Thema der Gruppierung interessierte, habe ich mal eine Batch geschrieben die sich auch zum zusammen Kopieren von Textdateien eignen würde.

In deinem Text gehst du wie selbstverständlich davon aus das eine pdf Datei nur eine Seite hat, was aber nur in deinem konkreten Fall so sein dürfte.
Ich habe möglichst sprechende Variablennamen verwendet, speche aber von Files nicht Seiten.

01.
:: MergeFilesGroup.cmd ::::::::::::::::::::::::::::::::::::::::::::::: 
02.
@Echo off&SetLocal 
03.
Set Base=D:\Test\ 
04.
Set Ext=cmd 
05.
Set FilesPerGroup=5 
06.
Set Prefix=A 
07.
:: ^^^^^ Variablen oberhalb anpassen. 
08.
Pushd "%Base%" 
09.
For /F %%A in ('Dir /B /A-D /OD "*.%Ext%"^|Find /V /C "" ') Do Set FileCnt=%%A 
10.
Set /A "FullGroupCnt=FileCnt/FilesPerGroup,LastGroupFilesCnt=FileCnt %% FilesPerGroup+1000" 
11.
For /F "tokens=1,* Delims=:" %%A in ( 
12.
  'Dir /B /A-D /OD "*.%Ext%"^|Findstr /N $' 
13.
    ) Do Call :BuildGroups %%A "%%B" 
14.
Set /A "FilesPerGroup+=1000" 
15.
Set FilesPerGroup=%FilesPerGroup:~-3% 
16.
For /F "tokens=2,* delims=_=" %%A in ( 
17.
  'set Group_') Do Set /A "GroupNum=%%A-1000"&Call :Process %%B 
18.
popd 
19.
Pause 
20.
Goto :Eof 
21.
 
22.
:BuildGroups 
23.
Set /A "GroupNum=(%1-1) / FilesPerGroup +1001" 
24.
Call Set Group_%GroupNum%=%%Group_%GroupNum%%% %2 
25.
Goto :Eof 
26.
 
27.
:Process 
28.
If %GroupNum% LEQ %FullGroupCnt% ( 
29.
  Set GroupName=%Prefix%_%GroupNum%_%FilesPerGroup%.%Ext% 
30.
) Else ( 
31.
  Set GroupName=%Prefix%_%GroupNum%_%LastGroupFilesCnt:~-3%.%Ext% 
32.
33.
Echo pdftk %* cat output %GroupName%
Wenn nach Anpassung der Variablen die Ausgabe korrekt erscheint, kann das Echo in der letzten Zeile und die Pause in Zeile 19 entfernt werden.

Gruß
LotPings
Bitte warten ..
Mitglied: kasimodo
24.06.2009 um 21:50 Uhr
Danke LotPings !!

Stchwort "Gruppierung" - genau das war der Punkt an dem ich nicht weiter kam.

Klasse deine Lösung für Windows

Die Gruppierung ist ein kleiner aber wichtiger Teil in der von mir geplanten "großen" Batch. Dank deiner Hilfe kann es nun damit weiter gehen.

Danke und Gruß
Kasimodo
Bitte warten ..
Mitglied: kasimodo
27.06.2009 um 01:08 Uhr
Hallo!

Nun geht das Gruppieren auch über SubFolder!

Nur eine kleine Frage bleibt:
Wie kann ich die Anzahl der Zeichen von der Variable "Base" ermitteln und diese Anzahl einer neuen Variable zuweisen?
Dann könnte ich den Wert der neuen Variable für Set "FILE_PATH=!FILE_PATH:~10!" benutzen! Die "10" soll durch variable ersetzt werden! (siehe im Code unten - zwischen den vielen !!!!!)

Danke & Gruß
kasimodo

01.
rem Gruppieren & Packen & Umbenennen 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
cls 
04.
 
05.
rem ------ Variable setzen --------- 
06.
Set "Base=D:\ABC_READ" 
07.
set "Ausgabe=D:\ABC_Fertig" 
08.
Set "Ext=pdf" 
09.
Set "FilesPerGroup=20" 
10.
rem ------ Variable setzen Ende--------- 
11.
 
12.
Pushd "%Base%" 
13.
Rem run for all SubFolders 
14.
For /f %%i in ('dir /B /AD /S /ON') do ( 
15.
cd %%i 
16.
Set "FILE_PATH=%%~pni" 
17.
Set "FILE_PATH=!FILE_PATH:\=_!" 
18.
 
19.
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
20.
rem Anpassen in Abhaenigkeit Laenge vom "Base" (benoetig fuer Name 'sOutputfile') 
21.
rem Anzahl von Zeichen in "Base"-1 
22.
Set "FILE_PATH=!FILE_PATH:~10!" 
23.
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
24.
 
25.
rem ----------- Gruppierung ------------ 
26.
For /F %%A in ('Dir /B /A-D /OD "*.%Ext%"^|Find /V /C ""') Do Set FileCnt=%%A 
27.
IF NOT !FileCnt!==0 ( 
28.
Set /A "FullGroupCnt=FileCnt/FilesPerGroup" 
29.
Set /A "LastGroupFilesCnt=FileCnt - FullGroupCnt * FilesPerGroup" 
30.
For /F "tokens=1,* Delims=:" %%A in ('Dir /B /A-D /OD "*.%Ext%"^|Findstr /N $') Do Call :BuildGroups %%A "%%B" 
31.
rem -------------------------------------- 
32.
For /F "tokens=2,* delims=_=" %%A in ('set Group_') Do Set /A "GroupNum=%%A"&Call :Process %%B 
33.
For /F "tokens=1,* delims==" %%k in ('set Group_') Do Set %%k= 
34.
35.
36.
Popd 
37.
pause 
38.
Goto :Eof 
39.
 
40.
rem ====== SUB Begin ========= 
41.
rem--------- Gruppe erstellen------ 
42.
:BuildGroups 
43.
Set /A GroupNum=(%1-1) / %FilesPerGroup% +1001 
44.
Call Set Group_%GroupNum%=%%Group_%GroupNum%%% %2 
45.
Goto :Eof 
46.
rem--------- Gruppe Ende------ 
47.
 
48.
:Process 
49.
rem mache etwas damit 
50.
echo !FILE_PATH! 
51.
echo %GroupNum% 
52.
echo  %* 
53.
Goto :Eof 
54.
rem ======= SUB END ========= 
55.
 
Bitte warten ..
Mitglied: LotPings
27.06.2009 um 10:21 Uhr
Hallo kasimofo,

Wenn du zwischendurch CD benutzt, hast du das Konzept von Pushd Popd nicht wirklich verstanden. Siehe Pushd /?

Auch kann man Calls weiter staffeln und dabei auch mit setlocal/endlocal arbeiten um nicht alte Variableninhalte mitzuschleppen. (Das löschen der Group_ Variablen kann somit entfallen) Siehe setlocal /?

Wenn File_Path den relativen Pfad enthalten soll, kannst du einfach Base aus File_Path entfernen mit
set File_Path=!File_Path:%Base%=!

Oder nimm in deiner Zeile 16 gleich statt %~pni besser %~nxi um den Ordner Namen zu erhalten.

Ich habe im Code zwei Zeilen eingebaut um das Debuggen zu erleichtern.
Wenn die Variable Debug auf "::" gesetzt ist werden die Zeilen ignoriert, bei Echo. erhältst du die Ausgabe

Die For Schleife zum ermitteln des fileCnt hat im Dir einen Umleitung der Fehlerausgabe auf NUL erhalten um "Datei naicht gefunden" zu unterdrücken.

01.
rem Gruppieren & Packen & Umbenennen 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
cls 
04.
rem ------ Variable setzen --------- 
05.
Set "Base=D:\ABC_READ" 
06.
set "Ausgabe=D:\ABC_Fertig" 
07.
Set "Ext=pdf" 
08.
Set "FilesPerGroup=20" 
09.
Set "Debug=:: " 
10.
:: set Debug=Echo. 
11.
rem ------ Variable setzen Ende--------- 
12.
Set Base=D:\Test 
13.
set "Ext=cmd" 
14.
Pushd "%Base%" 
15.
:: run For Base Folder 
16.
For %%i in (%CD%) do Call :ProcFold "%%i" "%%~nxi" 
17.
:: run for all SubFolders 
18.
For /f %%i in ('dir /B /AD /S /ON') do Call :ProcFold "%%i" "%%~nxi" 
19.
Popd 
20.
pause 
21.
Goto :Eof 
22.
 
23.
:ProcFold  %1=Kompletter Pfad %2=Name.Erw  ------ Ordner verarbeiten ------- 
24.
Setlocal 
25.
Pushd %1 
26.
%Debug% %CD% %1 %2 &Pause 
27.
Set "Folder_Name=%~2 
28.
For /F %%A in ('Dir /B /A-D /OD "*.%Ext%"2^>NUL^|Find /V /C "" ') Do Set FileCnt=%%A 
29.
IF 0==%FileCnt% Goto :Exit 
30.
Set /A "FullGroupCnt=FileCnt/FilesPerGroup" 
31.
Set /A "LastGroupFilesCnt=FileCnt - FullGroupCnt * FilesPerGroup" 
32.
For /F "tokens=1,* Delims=:" %%A in ('Dir /B /A-D /OD "*.%Ext%"^|Findstr /N $') Do Call :BuildGroup %%A "%%B" 
33.
rem -------------------------------------- 
34.
For /F "tokens=2,* delims=_=" %%A in ('set Group_') Do Set /A "GroupNum=%%A"&Call :ProcGroup %%B 
35.
:Exit 
36.
Popd 
37.
:: mit dem Goto :Eof ist ein Endlocal implizit 
38.
Goto :Eof 
39.
 
40.
:BuildGroup       --------- Gruppe erstellen ------ 
41.
Set /A GroupNum=(%1-1) / %FilesPerGroup% +1001 
42.
Call Set Group_%GroupNum%=%%Group_%GroupNum%%% %2 
43.
%Debug% Call Set Group_%GroupNum%=%%Group_%GroupNum%%% %2 
44.
Goto :Eof 
45.
 
46.
:ProcGroup       --------- Gruppe ausgeben ------ 
47.
rem mache etwas damit 
48.
echo CD=%CD% Folder_Name=%Folder_Name%  
49.
echo Gruppe=%GroupNum:~-3% 
50.
echo  %* 
51.
Goto :Eof
Gruß
LotPings
Bitte warten ..
Mitglied: kasimodo
30.06.2009 um 20:37 Uhr
Hallo LotPings,

vielen Dank für die Hinweise und deine Hilfe!!
ich hatte die letzten Tage nicht viel Zeit und konnte erst heute weitermachen. Das Script macht nun alles so wie ich es möchte.

Auch die Namensbildung der Ausgabedatei %"GroupName"% ist nun OK. Habe es etwas anders gemacht als von dir vorgeschlagen. Der Name soll sich aus allen SubVerzeichnisnamen - beginn nach %Base% - zusammensetzen. Der "\" wird durch "_" ersetzt. (Siehe ab "Set "File_Path= " und folgend.) Geht bestimmt auch kürzer - aber es funktioniert! Duch die extra SUB für "GroupName" kann ich schnell auf Veränderungen reagieren.

Danke und Gruß
kasimodo



01.
rem Gruppieren & Packen & Umbenennen 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
cls 
04.
rem ------ Variable setzen --------- 
05.
Set "Base=D:\ABC_READ" 
06.
set "Ausgabe=D:\ABC_Fertig" 
07.
Set "Ext=pdf" 
08.
Set "FilesPerGroup=20" 
09.
set GS=D:\Programme\gs\gs8.64\bin\gswin32 
10.
Set "Debug=:: " 
11.
:: set Debug=Echo. 
12.
rem ------ Variable setzen Ende--------- 
13.
 
14.
rem ----- fuer Test------ 
15.
:: Set Base=D:\Test 
16.
:: set "Ext=cmd" 
17.
rem ----- fuer Test ENDE------ 
18.
 
19.
Pushd "%Base%" 
20.
:: run For Base Folder --- wird nicht gebraucht ---- 
21.
rem For %%i in (%CD%) do Call :ProcFold "%%i" "%%~nxi" 
22.
 
23.
:: run for all SubFolders 
24.
For /f %%i in ('dir /B /AD /S /ON') do Call :ProcFold "%%i" "%%~nxi" 
25.
Popd 
26.
rem cls 
27.
echo. 
28.
echo. 
29.
echo ------------------------------------------ 
30.
echo. 
31.
echo               FERTIG 
32.
echo. 
33.
echo ------------------------------------------ 
34.
echo. 
35.
pause 
36.
Goto :Eof 
37.
 
38.
:ProcFold  %1=Kompletter Pfad %2=Name.Erw  ------ Ordner verarbeiten ------- 
39.
Setlocal 
40.
Pushd %1 
41.
%Debug% %CD% %1 %2 &Pause 
42.
 
43.
Set "File_Path=%CD%" 
44.
Set "File_Path=!File_Path:%Base%=!" 
45.
Set "File_Path=!File_Path:\=_!" 
46.
Set "File_Path=!File_Path:~1!" 
47.
 
48.
For /F %%A in ('Dir /B /A-D /OD "*.%Ext%"2^>NUL^|Find /V /C "" ') Do Set FileCnt=%%A 
49.
IF 0==%FileCnt% Goto :Exit 
50.
Set /A "FullGroupCnt=FileCnt/FilesPerGroup" 
51.
Set /A "LastGroupFilesCnt=FileCnt - FullGroupCnt * FilesPerGroup" 
52.
For /F "tokens=1,* Delims=:" %%A in ('Dir /B /A-D /OD "*.%Ext%"^|Findstr /N $') Do Call :BuildGroup %%A "%%B" 
53.
rem -------------------------------------- 
54.
For /F "tokens=2,* delims=_=" %%A in ('set Group_') Do Set /A "GroupNum=%%A"&Call :ProcGroup %%B 
55.
:: ----- PDF Quelle Umbenennen nach *.pd_------ 
56.
rem ren *.%Ext% *.pd_ 
57.
:Exit 
58.
Popd 
59.
Goto :Eof 
60.
 
61.
:BuildGroup       --------- Gruppe erstellen ------ 
62.
Set /A GroupNum=(%1-1) / %FilesPerGroup% +1001 
63.
Call Set Group_%GroupNum%=%%Group_%GroupNum%%% %2 
64.
%Debug% Call Set Group_%GroupNum%=%%Group_%GroupNum%%% %2 
65.
Goto :Eof 
66.
 
67.
:ProcGroup       --------- Gruppe ausgeben ------ 
68.
Call :BuildName GroupName 
69.
echo. --------------------------- 
70.
pdftk %* cat output "%Ausgabe%\%GroupName%" dont_ask 
71.
Goto :Eof 
72.
 
73.
:BuildName      ---Regel fuer Name "GroupName" --- 
74.
If %FileCnt% LEQ %FilesPerGroup% (Set "LongGroupNum=_") ELSE (Set "LongGroupNum=__%GroupNum:~-2%") 
75.
Set /A "LongFilesPerGroup=FilesPerGroup + 1000,LongLastGroupFilesCnt=LastGroupFilesCnt + 1000" 
76.
Set LongFilesPerGroup=%LongFilesPerGroup:~-2% 
77.
Set LongLastGroupFilesCnt=%LongLastGroupFilesCnt:~-2% 
78.
Set /A "GroupNum-=1000" 
79.
If %GroupNum% LEQ %FullGroupCnt% ( 
80.
	Set Name=!File_Path!%LongGroupNum%_S%LongFilesPerGroup%.%Ext% 
81.
) Else ( 
82.
	Set Name=!File_Path!%LongGroupNum%_S%LongLastGroupFilesCnt%.%Ext% 
83.
84.
set "%1=%Name%"&goto :eof
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch: Bilder (gewisse Nummern) vom Verzeichnis A in einen Ordner Kopieren (3)

Frage von sagula91 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Schleife als FOR-SCHLEIFE (2)

Frage von mp2711 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...