redballon
Goto Top

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.

@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]

Content-Key: 131949

Url: https://administrator.de/contentid/131949

Ausgedruckt am: 28.03.2024 um 11:03 Uhr

Mitglied: Biber
Biber 18.12.2009 um 12:02:34 Uhr
Goto Top
Moin RedBallon,

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
Mitglied: Redballon
Redballon 18.12.2009 um 16:11:18 Uhr
Goto Top
Also zum Verständnis:

1. Alle im Quell-Verzeichnis liegenden Dateien sollen einzeln genommen werden und in das Zielverzeichnis mit 7-zip gepackt werden.
Kurz: Nimm eine Datei von Quelle (c:\Test) packe sie in dasselbe Verzeichnis beim Ziel (D:\crapTest) aber gepackt.
Für die Dateinamen wird die Liste listing.txt verwendet.
Beispiel:
c:\Test\1.txt -> D:\crapTest\1.zip
c:\Test\2.txt -> D:\crapTest\2.zip
c:\Test\BinEinWeitererOrdner\3.txt -> D:\crapTest\BinEinWeitererOrdner\3.zip
c:\Test\BinEinWeitererOrdner\4.txt -> D:\crapTest\BinEinWeitererOrdner\4.zip

Die Dateinamen sind dabei unique. Muss also keine Überprüfung rein ob der schon Name vorhanden ist.

2. Die Quelldateien bleiben unverändert.
Sollte später eine Änderung eintreten, könnte man bei 7Zip mit einem Schalter das bestehende Archiv updaten.

3. Da es sich um eine Art von Sicherung (angedachtes "Mirror") handelt kann ich mit NTFS-Komprimierung bzw. Gesamtzips wenig anfangen. -.- Das Entpacken bzw . Updaten von Dateien dauert zulange. Und die Lösung sollte ggf. dann alternativ mit einem USB-Stick funktionieren, da gibt es standardmässig nur FAT32 als Filesystem. face-sad

Gruss Red
Mitglied: bastla
bastla 18.12.2009 um 21:18:28 Uhr
Goto Top
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:
@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
Grüße
bastla
Mitglied: Redballon
Redballon 19.12.2009 um 14:01:43 Uhr
Goto Top
Für Biber.

Vielen lieben Dank nochmal für die NAchfrage. WAr ein bissl kompliziert geschrieben, ich gelobe Besserung. face-smile
Und danke das Du Alternativtips aufgezeigt hast. face-smile

Für bastla

Haaaaaammmmer. Es wirkt. face-smile Respekt für diese Leistung. Sehe ein wollte zuviel in eine Funktion packen. face-smile
Wusste garnicht das man Variablen so verketten kann. Wieder was gelernt. face-smile

So nun noch ein paar Anmerkungen meinerseits für diese Batchdatei.

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. =)
Eigentlich war der Befehl mit Xcopy /t /e zur Sicherstellung das auch leere Verzeichnisse erstellt werden.

Desweiteren kann man mittels Reg-Query nachfragen ob 7-Zip installiert ist und wenn ja, dann nutze diese Pfad.
Es kann ja sein das es woanders installiert ist als C:\Programme. Funktioniert hat es unter Windows XP und 7. face-smile

Da andere Leute vielleicht Dateien haben, die gleichen Namen aber andere Dateiänderung haben, habe ich die Batchdatei angepasst unter dem Unterprogramm. face-smile
statt set "Pfad=%~dpn1.zip"
das set "Pfad=%~f1.zip"

Man kann das gerne beliebig erweitern z.b. mit Promptabfrage wo Start- und Zielordner sind aber da Windows 7 und Vista transparente Umleitungen auf andere Ordner hat, symbolische Hard und Softlinks hat und UAC und blaaaaaaa...
So genug geredet, nun kommt die Batch von mir.
Mitglied: Redballon
Redballon 19.12.2009 um 14:04:57 Uhr
Goto Top
@echo off & setlocal

REM Bin das Quellverzeichnis
set vQuelle=C:\Test
REM Bin das Zielverzeichnis
set vZiel=D:\crapTest

REM Ich überprüfe ob 7-Zip installiert ist 
reg query HKLM\software\7-zip /v Path
cls 
if errorlevel 0 goto ItWorks
:ItWorksNot
echo Bitte 7-zip installieren 

:ItWorks
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 /e "%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 ".gz"  
set "Pfad=%~f1.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)

for /f "tokens=2*" %%a in ('reg query "HKLM\software\7-zip" /v Path') do set "v7zip=%%b"  

%v7zip%\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

[Edit Biber] sieht in Codetags noch schöner aus, [/Edit]
Mitglied: bastla
bastla 19.12.2009 um 14:28:14 Uhr
Goto Top
Hallo Redballon!
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 ... face-wink
set "Pfad=%~f1.zip"
ließe sich noch weiter verallgemeinern, indem Du den Zusatz ".zip" gleich am Anfang des Batches einer Variablen zuweist und dann diese verwendest, etwa:
set "Endung=.zip"
und
set "Pfad=%~f1%Endung%"
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:
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
Grüße
bastla

P.S.: Noch eine Verbesserungsmöglichkeit: Verwende doch bitte -Tags ...
[Edit] Durch Biber (rechts) überholt ... face-wink [/Edit]
Mitglied: Redballon
Redballon 19.12.2009 um 15:18:48 Uhr
Goto Top
Habe ich auch gleich gemacht. Danke nochmal.
Wegen der Formatierungshilfe. Gelobe Besserung. Mein Browser sollte nur mal renoviert werden. =)