Syncronisieren und packen von vielen Dateien mit Unterstrukturen in ein anderes Verzeichnis mit gleicher Struktur
Hallo zusammen. Ich hoffe ihr könnt mir weiterhelfen, da ich Probleme mit For-Schleifen habe bei folgenden Ziel:
Es soll ein Quellordner mit Unterverzeichnissen eingelesen werden, am Zielordner soll die Ordnerstruktur erhalten bleiben.
Alle sich im Quellordner befindlichen Dateien sollen dann gepackt (mit 7-zip) in der Ordnerstruktur des Zielordners abgelegt werden.
[Edit Biber] Auf Codeformatierung geändert [/Edit]
Es soll ein Quellordner mit Unterverzeichnissen eingelesen werden, am Zielordner soll die Ordnerstruktur erhalten bleiben.
Alle sich im Quellordner befindlichen Dateien sollen dann gepackt (mit 7-zip) in der Ordnerstruktur des Zielordners abgelegt werden.
@echo off
^^REM Bin das Quellverzeichnis^^
set vQuelle=C:\Test
^^REM Bin das Zielverzeichnis^^
set vZiel=D:\crapTest
^^REM Bin eine Dateiliste des Quellordners^^
set vDateiListe=%Ziel%\listing.txt
^^REM Ich kopiere die Verzeichnisstruktur mit beliebiger Tiefe in die Zielverzeichnis^^
xcopy /t %vQuelle% %vZiel%
^^REM Ich schreibe ein Listing der kompletten Verzeichnisstruktur des Quellordners in die Listing.txt^^
dir %vQuelle%\*.* /s/b > %vDateiListe%
^^REM Ich schreibe das Listing des Verzeichnis des Zielordners in die ListingNew.txt^^
dir /ad /s /b %vQuelle% > ListingNew.txt
^^REM Hier bin ich machtlos. So wie ich das sehe sollten 2 Forschleifen rein, um anhand der beiden Dateien Listing und ListingNew.txt die Dateien dann zu packen und in die Ziel-Verzeichnisstruktur zu packen.^^
^^REM Diese Schleife ist für das Packen gedacht, leider funktioniert die Zielangabe nicht, deswegen 2 Scheifen ?^^
for /f "delims=" %%a in (%vZiel%%vDateiListe%) do C:\Programme\7-Zip\7z a -tzip "%vZiel%%~nI.zip" %%a
pause
[Edit Biber] Auf Codeformatierung geändert [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 131949
Url: https://administrator.de/forum/syncronisieren-und-packen-von-vielen-dateien-mit-unterstrukturen-in-ein-anderes-verzeichnis-mit-gleicher-131949.html
Ausgedruckt am: 23.04.2025 um 05:04 Uhr
7 Kommentare
Neuester Kommentar
Moin RedBallon,
willkommen im Forum.
Verständnisfragen:
Grüße
Biber
willkommen im Forum.
Verständnisfragen:
- die in der QUELLverzeichnisstruktur vorhandenen Dateien sollen verzeichnisweise in das ZIELverzeichnis gezipt werden? Beispiel: alle Dateien des Ordners c:\Test\bla\*.*) werden als Zipdatei "Bla.7z" zu "D:\crapTest\bla\Bla.7z" ?
- die Quelldateien bleiben unverändert (nichts wird gelöscht, kein Archivbit gesetz oder ähnliches)?
- Wäre es nicht einfacher, die neuen Ordner auf D:\craptest einfach als "komprimierte Ordner" anzulegen - dann kannst du doch viel einfacher "synchronisieren".?
Grüße
Biber
Hallo Redballon und auch von mir ein Willkommen!
Da Du die absouten Quell- und Ziel-Basispfade vorgibst, brauchst Du ja eigentlich nur den einen durch den anderen zu ersetzen (und das ganz ohne temporäre Dateilisten) - also etwa:
Grüße
bastla
Da Du die absouten Quell- und Ziel-Basispfade vorgibst, brauchst Du ja eigentlich nur den einen durch den anderen zu ersetzen (und das ganz ohne temporäre Dateilisten) - also etwa:
@echo off & setlocal
REM Bin das Quellverzeichnis
set vQuelle=C:\Test
REM Bin das Zielverzeichnis
set vZiel=D:\crapTest
REM Ich kopiere die Verzeichnisstruktur mit beliebiger Tiefe in das Zielverzeichnis
REM und verbitte mir (bei noch nicht vorhandenem Zielverzeichnis) durch den "\" am Ende
REM eine dumme Frage (was soll mit "/t" wohl erstellt werden)
xcopy /t "%vQuelle%" "%vZiel%\"
REM Ich rufe aus einer Schleife für jede Datei unterhalb des Quellpfades das Unterprogramm
REM ":ProcessFile" auf und uebergebe den Pfad der Datei als Parameter
for /f "delims=" %%i in ('dir /s /b /a-d "%vQuelle%"') do call :ProcessFile "%%i"
REM Bin das Hauptprogramm und ende hier (nach einer kurzen Pause)
pause
goto :eof
REM Bin das Unterprogramm
:ProcessFile
REM Ich erstelle als Zwischenergebnis aus dem Parameter (%1)
REM den (Quell-)Dateipfad mit der Endung ".zip"
set "Pfad=%~dpn1.zip"
REM Ich ersetze in %Pfad% %vQuelle% durch %vZiel%
call set "Pfad=%%Pfad:%vQuelle%=%vZiel%%%"
REM Ich erzeuge etwas Output
echo Erstelle: %Pfad%
REM Ich 7zippe die als Parameter übergebene Datei
REM (ohne nachzusehen, ob die Ziel-ZIP-Datei schon existiert)
C:\Programme\7-Zip\7z a -tzip "%Pfad%" %1 >nul
REM Ich bin mit dem Unterprogramm fertig und mache im Hauptprogramm
REM (in der Schleife) mit der naechsten Datei weiter.
goto :eof
bastla
Hallo Redballon!

ließe sich noch weiter verallgemeinern, indem Du den Zusatz ".zip" gleich am Anfang des Batches einer Variablen zuweist und dann diese verwendest, etwa:
und
Wenn Du schon am Optimieren bist:
Der Pfad zu 7-Zip wird sich vermutlich zwischen den einzelnen zu durchlaufenden Dateien nicht ändern und könnte (ich meine: sollte) daher nur einmal vorweg ermittelt werden; das lässt sich auch gleich mit der Prüfung verbinden, ob dieser Pfad überhaupt in der Registry zu finden ist - falls nicht, sollte der Batch beendet werden:
Grüße
bastla
P.S.: Noch eine Verbesserungsmöglichkeit: Verwende doch bitte -Tags ...
[Edit] Durch Biber (rechts) überholt ...
[/Edit]
der Xcopy-Befehl ist eine zusätzliche Sicherung, damit auch wirklich die Verzeichnisstruktur am Ziel da ist. Kann eigentlich wegen der Erzeugung in der Schleife weggelassen werden. Aber safety first. =)
... und da Du den Batch ja universeller anlegen wolltest, auch sinnvoll, da zwar 7-Zip das Zielverzeichnis erstellen kann, aber andere Programme / Aktionen dieses tatsächlich vorweg benötigen könnten.Eigentlich war der Befehl mit Xcopy /t /e zur Sicherstellung das auch leere Verzeichnisse erstellt werden.
Meine Überlegung war, dass sich in leeren Verzeichnissen selten Dateien zum 7zippen finden ... set "Pfad=%~f1.zip"
set "Endung=.zip"
set "Pfad=%~f1%Endung%"
Der Pfad zu 7-Zip wird sich vermutlich zwischen den einzelnen zu durchlaufenden Dateien nicht ändern und könnte (ich meine: sollte) daher nur einmal vorweg ermittelt werden; das lässt sich auch gleich mit der Prüfung verbinden, ob dieser Pfad überhaupt in der Registry zu finden ist - falls nicht, sollte der Batch beendet werden:
set "v7zip="
for /f "tokens=2*" %%a in ('reg query "HKLM\software\7-zip" /v Path 2^>nul') do set "v7zip=%%b"
if not defined v7zip echo Bitte 7-zip installieren! & goto :eof
bastla
[Edit] Durch Biber (rechts) überholt ...