Per Batch Datei in Verzeichnisse wechseln und mit 7Zip bestimmte Dateien packen und in ein Jahreszip packen.
Hallo zusammen,
folgende Ausgangslage. Ich muss per Batch-Datei in einem Verzeichnis in verschiedene Unterverzeichnisse wechseln. Dort liegen immer mal wieder Schnittstellendateien (XML oder CSV) herum. Diese müssen dann gepackt mit 7ZIP in ein ZIP Archiv (also für jedes Archive Verzeichnis eine eigene ZIP) gepackt werden (der o.g. Batch Job soll immer mal wieder laufen und die neuen Dateien hinzufügen). Manuell klappt das recht gut - automatisiert bekomme ich es einfach nicht hin.
Kurz zur Erklärung:
Es sieht grundsätzlich so aus:
d:\Schnittstelle01\Archive\datei1.xml, datei2.xml, datei3.xml, datei 4.xml...
d:\Schnittstelle02\Archive\datei1.xml, datei2.xml, datei3.xml, datei 4.xml...
d:\Schnittstelle03\Archive\datei1.xml, datei2.xml, datei3.xml, datei 4.xml...
d:\Schnittstelle04\Archive\datei1.xml, datei2.xml, datei3.xml, datei 4.xml...
d:\Schnittstelle05\Archive\datei1.csv, datei2.csv, datei3.csv, datei 4.csv...
Im Verzeichnis Archive soll nun die jeweils besagte ZIP Datei angelegt werden. Diese soll stets alle XML oder CSV Dateien aus dem Archive Verzeichnis beinhalten.
Weitere Herausforderung dabei: Am besten sollen die ZIP Dateien nach Jahren getrennt angelegt werden. Also die ZIP Datei soll nur die CSV oder XML-Dateien beinhalten, die auch im jeweiligen Jahr in den Ordner gelegt wurden. Im Folgejahr soll ein neus ZIP Archiv angelegt werden usw.
Danke!
folgende Ausgangslage. Ich muss per Batch-Datei in einem Verzeichnis in verschiedene Unterverzeichnisse wechseln. Dort liegen immer mal wieder Schnittstellendateien (XML oder CSV) herum. Diese müssen dann gepackt mit 7ZIP in ein ZIP Archiv (also für jedes Archive Verzeichnis eine eigene ZIP) gepackt werden (der o.g. Batch Job soll immer mal wieder laufen und die neuen Dateien hinzufügen). Manuell klappt das recht gut - automatisiert bekomme ich es einfach nicht hin.
Kurz zur Erklärung:
Es sieht grundsätzlich so aus:
d:\Schnittstelle01\Archive\datei1.xml, datei2.xml, datei3.xml, datei 4.xml...
d:\Schnittstelle02\Archive\datei1.xml, datei2.xml, datei3.xml, datei 4.xml...
d:\Schnittstelle03\Archive\datei1.xml, datei2.xml, datei3.xml, datei 4.xml...
d:\Schnittstelle04\Archive\datei1.xml, datei2.xml, datei3.xml, datei 4.xml...
d:\Schnittstelle05\Archive\datei1.csv, datei2.csv, datei3.csv, datei 4.csv...
Im Verzeichnis Archive soll nun die jeweils besagte ZIP Datei angelegt werden. Diese soll stets alle XML oder CSV Dateien aus dem Archive Verzeichnis beinhalten.
Weitere Herausforderung dabei: Am besten sollen die ZIP Dateien nach Jahren getrennt angelegt werden. Also die ZIP Datei soll nur die CSV oder XML-Dateien beinhalten, die auch im jeweiligen Jahr in den Ordner gelegt wurden. Im Folgejahr soll ein neus ZIP Archiv angelegt werden usw.
Danke!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 212534
Url: https://administrator.de/forum/per-batch-datei-in-verzeichnisse-wechseln-und-mit-7zip-bestimmte-dateien-packen-und-in-ein-jahreszip-packen-212534.html
Ausgedruckt am: 17.04.2025 um 05:04 Uhr
27 Kommentare
Neuester Kommentar
... und soferne das Änderungsdatum für die Zuordnung zu einem passenden "Jahres"-Archiv genügt, ließe sich mit
auch die .zip-Datei gezielter ansprechen ...
Um automatisiert nur die "D:\Schnittstelle*"-Ordner abzuarbeiten, böte sich noch ein "
Grüße
bastla
for /r "D:\Schnittstelle01" %%a in (*.xml *.csv) do (
for /f "tokens=1-3 delims=. " %%i in ("%%~ta") do (
echo "%%a" aus dem Jahr %%k
rem lieber 7z pack mal die Datei "%%a" in das Archiv "%%k_xyz.zip"
)
)
Um automatisiert nur die "D:\Schnittstelle*"-Ordner abzuarbeiten, böte sich noch ein "
for /d
" außen rum an ...Grüße
bastla
Hallo l-vizz!
- solltest Du eigentlich schon selbst gehabt haben ...
BTW: Ein "
Grüße
bastla
P.S.: Verwende bitte für Batch-Schnipsel "Code"-Formatierung ...
Hast Du noch irgendeine Idee?
Die Idee, Dir einmal die Commandline-Optionen von "7zip" anzusehen - zur Not einfach mit"C:\Users\test\Desktop\test_zipping\7zip\7z.exe" -?
BTW: Ein "
call
" ist hier unnötig.Grüße
bastla
P.S.: Verwende bitte für Batch-Schnipsel "Code"-Formatierung ...
Hallo l-vizz!
Grüße
bastla
Das ist wahrscheinlich durch den Schleifendurchlauf eliminiert.
Eigentlich nicht - Du solltest ja in Zeile 3 den vollständigen Pfad ausgegeben bekommen (zur Sicherheit könntest Du noch "%%~fa
" anstelle von "%%a
" verwenden).Das Skript packt ja alle Dateien in ein ZIP - es sollen aber pro Schnittstelle eine Datei erzeugt werden. Das ist aber wahrscheinlich das, was Du oben meintest, oder? Also mit dem "for /d" außen rum?
Yep.Grüße
bastla
Hallo l-vizz!
Die Schleife benötigt natürlich auch eine Variable, in welcher sich dann bei jedem Durchlauf der Pfad zum Ordner befindet:
Grüße
bastla
Ich muss mir gleich mal ergoogeln was das eigentlich im Detail bedeutet.
Schau Dir einmal "for /?
" (vor allem gegen Ende) an ...Die Schleife benötigt natürlich auch eine Variable, in welcher sich dann bei jedem Durchlauf der Pfad zum Ordner befindet:
for /d %%o in ("C:\Users\test\Desktop\test_zipping\test\Schnittstelle*") do (
echo Bearbeite Ordner "%%o"
)
bastla
Hallo l-vizz!
Du vergibst ja auch nur einen Namen, aber keinen Pfad für die .zip-Datei - daher eher so:
Grüße
bastla
Du vergibst ja auch nur einen Namen, aber keinen Pfad für die .zip-Datei - daher eher so:
@echo off
for /d %%o in ("C:\Users\test\Desktop\test_zipping\test\schnittstelle*") do (
echo Bearbeite Ordner "%%o"
for /r "%%o" %%a in (*.xml *.csv) do (
for /f "tokens=1-3 delims=. " %%i in ("%%~ta") do (
echo "%%a" aus dem Jahr %%k
"C:\Users\test\Desktop\test_zipping\7zip\7z.exe" a "%%~o\%%k_test.zip" %%a
)
)
)
bastla
Hallo l-vizz!
Versuch's mal damit:
Grüße
bastla
[Edit] "Test-echo" entfernt [/Edit]
Versuch's mal damit:
@echo off
for /d %%o in ("C:\Users\test\Desktop\test_zipping\test\schnittstelle*") do call :ProcessDir "%%o"
goto :eof
:ProcessDir
echo Bearbeite Ordner %1
for /r %1 %%a in (*.xml *.csv *.txt) do (
for /f "tokens=1-3 delims=. " %%i in ("%%~ta") do (
echo "%%a" aus dem Jahr %%k
"C:\Users\test\Desktop\test_zipping\7zip\7z.exe" a "%~1\%%k_test.zip" %%a
)
)
goto :eof
bastla
[Edit] "Test-echo" entfernt [/Edit]
Hallo l-vizz!
So wild ist das mit der angesprochenen Zeile eigentlich nicht - lässt sich leicht nachvollziehen, wenn Du das nur für eine Datei versuchst - direkt in der CMD-Shell zB so:
Grüße
bastla
So wild ist das mit der angesprochenen Zeile eigentlich nicht - lässt sich leicht nachvollziehen, wenn Du das nur für eine Datei versuchst - direkt in der CMD-Shell zB so:
for %a in ("C:\Users\test\Desktop\test_zipping\test\schnittstelle01\testdokument.xml") do for /f "tokens=1-3 delims=. " %i in ("%~ta") do @echo %i_%j_%k
bastla
Hallo l-vizz!
Anhand Deines Beispiels
sähe das so aus: Zunächst gibt es die äußere Schleife, die dafür sorgt, dass mit "%%a" die Datei angesprochen wird. Das ermöglicht, mit "%%~ta" das Änderungsdatum (23.07.2013 14:32) der Datei zu erhalten (siehe dazu "
).
Die von Dir angesprochene innere Schleife erhält nun diesen Timestamp (wegen der Anführungszeichen wird "%%~ta" nicht als Verweis auf eine Datei, sondern als Text interpretiert) zur Verarbeitung und macht nix anderes, als anhand der Delimiter Punkt und Leerzeichen den String zu zerlegen - es steht dann in "%%i" der Tag (23), in "%%j" die Monatsangabe (07) und in "%%k" die Jahreszahl (2013). Damit Jahr und Uhrzeit voneinander getrennt werden, wurde auch das Leerzeichen als Trennzeichen ("delimiter") festgelegt.
Wenn Du Dich noch ausführlicher mit der Thematik beschäftigen möchtest, sei Dir Friemlers "Tutorial zur FOR-Schleife" ans Herz gelegt ...
Grüße
bastla
Anhand Deines Beispiels
23.07.2013 14:32 514.377 ZRE_Z01_20130723_143114.ZIP
for /?
" ziemlich am Ende - ich merke gerade, ich wiederhole mich Die von Dir angesprochene innere Schleife erhält nun diesen Timestamp (wegen der Anführungszeichen wird "%%~ta" nicht als Verweis auf eine Datei, sondern als Text interpretiert) zur Verarbeitung und macht nix anderes, als anhand der Delimiter Punkt und Leerzeichen den String zu zerlegen - es steht dann in "%%i" der Tag (23), in "%%j" die Monatsangabe (07) und in "%%k" die Jahreszahl (2013). Damit Jahr und Uhrzeit voneinander getrennt werden, wurde auch das Leerzeichen als Trennzeichen ("delimiter") festgelegt.
Wenn Du Dich noch ausführlicher mit der Thematik beschäftigen möchtest, sei Dir Friemlers "Tutorial zur FOR-Schleife" ans Herz gelegt ...
Grüße
bastla