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

Syncronisieren und packen von vielen Dateien mit Unterstrukturen in ein anderes Verzeichnis mit gleicher Struktur

Frage Entwicklung Batch & Shell

Mitglied: Redballon

Redballon (Level 1) - Jetzt verbinden

18.12.2009, aktualisiert 11:47 Uhr, 4062 Aufrufe, 7 Kommentare

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.

01.
@echo off 
02.
^^REM Bin das Quellverzeichnis^^ 
03.
set vQuelle=C:\Test 
04.
 
05.
^^REM Bin das Zielverzeichnis^^ 
06.
set vZiel=D:\crapTest 
07.
 
08.
^^REM Bin eine Dateiliste des Quellordners^^ 
09.
set vDateiListe=%Ziel%\listing.txt 
10.
 
11.
^^REM Ich kopiere die Verzeichnisstruktur mit beliebiger Tiefe in die Zielverzeichnis^^ 
12.
xcopy /t %vQuelle% %vZiel%  
13.
 
14.
^^REM Ich schreibe ein Listing  der kompletten Verzeichnisstruktur des Quellordners in die Listing.txt^^ 
15.
dir %vQuelle%\*.* /s/b > %vDateiListe% 
16.
 
17.
^^REM Ich schreibe das Listing des Verzeichnis des Zielordners in die ListingNew.txt^^ 
18.
dir /ad /s /b %vQuelle% > ListingNew.txt 
19.
 
20.
^^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.^^ 
21.
 
22.
^^REM Diese Schleife ist für das Packen gedacht, leider funktioniert die Zielangabe nicht, deswegen 2 Scheifen ?^^ 
23.
for /f "delims=" %%a in (%vZiel%%vDateiListe%) do C:\Programme\7-Zip\7z a -tzip  "%vZiel%%~nI.zip" %%a 
24.
pause


[Edit Biber] Auf Codeformatierung geändert [/Edit]
Mitglied: Biber
18.12.2009 um 12:02 Uhr
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
Bitte warten ..
Mitglied: Redballon
18.12.2009 um 16:11 Uhr
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.

Gruss Red
Bitte warten ..
Mitglied: bastla
18.12.2009 um 21:18 Uhr
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:
01.
@echo off & setlocal 
02.
REM Bin das Quellverzeichnis 
03.
set vQuelle=C:\Test 
04.
 
05.
REM Bin das Zielverzeichnis 
06.
set vZiel=D:\crapTest 
07.
 
08.
REM Ich kopiere die Verzeichnisstruktur mit beliebiger Tiefe in das Zielverzeichnis 
09.
REM   und verbitte mir (bei noch nicht vorhandenem Zielverzeichnis) durch den "\" am Ende 
10.
REM   eine dumme Frage (was soll mit "/t" wohl erstellt werden) 
11.
xcopy /t "%vQuelle%" "%vZiel%\" 
12.
 
13.
REM Ich rufe aus einer Schleife für jede Datei unterhalb des Quellpfades das Unterprogramm  
14.
REM   ":ProcessFile" auf und uebergebe den Pfad der Datei als Parameter 
15.
for /f "delims=" %%i in ('dir /s /b /a-d "%vQuelle%"') do call :ProcessFile "%%i" 
16.
 
17.
REM Bin das Hauptprogramm und ende hier (nach einer kurzen Pause) 
18.
pause 
19.
goto :eof 
20.
 
21.
REM Bin das Unterprogramm 
22.
:ProcessFile 
23.
REM Ich erstelle als Zwischenergebnis aus dem Parameter (%1) 
24.
REM   den (Quell-)Dateipfad mit der Endung ".zip" 
25.
set "Pfad=%~dpn1.zip" 
26.
 
27.
REM Ich ersetze in %Pfad% %vQuelle% durch %vZiel% 
28.
call set "Pfad=%%Pfad:%vQuelle%=%vZiel%%%" 
29.
 
30.
REM Ich erzeuge etwas Output 
31.
echo Erstelle: %Pfad% 
32.
 
33.
REM Ich 7zippe die als Parameter übergebene Datei 
34.
REM   (ohne nachzusehen, ob die Ziel-ZIP-Datei schon existiert) 
35.
C:\Programme\7-Zip\7z a -tzip "%Pfad%" %1 >nul 
36.
 
37.
REM Ich bin mit dem Unterprogramm fertig und mache im Hauptprogramm 
38.
REM  (in der Schleife) mit der naechsten Datei weiter. 
39.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: Redballon
19.12.2009 um 14:01 Uhr
Für Biber.

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

Für bastla

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

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.

Da andere Leute vielleicht Dateien haben, die gleichen Namen aber andere Dateiänderung haben, habe ich die Batchdatei angepasst unter dem Unterprogramm.
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.
Bitte warten ..
Mitglied: Redballon
19.12.2009 um 14:04 Uhr
01.
@echo off & setlocal 
02.
 
03.
REM Bin das Quellverzeichnis 
04.
set vQuelle=C:\Test 
05.
REM Bin das Zielverzeichnis 
06.
set vZiel=D:\crapTest 
07.
 
08.
REM Ich überprüfe ob 7-Zip installiert ist  
09.
reg query HKLM\software\7-zip /v Path 
10.
cls  
11.
if errorlevel 0 goto ItWorks 
12.
:ItWorksNot 
13.
echo Bitte 7-zip installieren  
14.
 
15.
:ItWorks 
16.
REM Ich kopiere die Verzeichnisstruktur mit beliebiger Tiefe in das Zielverzeichnis 
17.
REM   und verbitte mir (bei noch nicht vorhandenem Zielverzeichnis) durch den "\" am Ende 
18.
REM   eine dumme Frage (was soll mit "/t" wohl erstellt werden) 
19.
xcopy /t /e "%vQuelle%" "%vZiel%\" 
20.
 
21.
REM Ich rufe aus einer Schleife für jede Datei unterhalb des Quellpfades das Unterprogramm  
22.
REM   ":ProcessFile" auf und uebergebe den Pfad der Datei als Parameter 
23.
for /f "delims=" %%i in ('dir /s /b /a-d "%vQuelle%"') do call :ProcessFile "%%i" 
24.
 
25.
REM Bin das Hauptprogramm und ende hier (nach einer kurzen Pause) 
26.
pause 
27.
goto :eof 
28.
REM Bin das Unterprogramm 
29.
:ProcessFile 
30.
REM Ich erstelle als Zwischenergebnis aus dem Parameter (%1) 
31.
REM   den (Quell-)Dateipfad mit der Endung ".gz" 
32.
set "Pfad=%~f1.zip" 
33.
 
34.
REM Ich ersetze in %Pfad% %vQuelle% durch %vZiel% 
35.
call set "Pfad=%%Pfad:%vQuelle%=%vZiel%%%" 
36.
 
37.
REM Ich erzeuge etwas Output 
38.
echo Erstelle: %Pfad% 
39.
 
40.
REM Ich 7zippe die als Parameter übergebene Datei 
41.
REM   (ohne nachzusehen, ob die Ziel-ZIP-Datei schon existiert) 
42.
 
43.
for /f "tokens=2*" %%a in ('reg query "HKLM\software\7-zip" /v Path') do set "v7zip=%%b" 
44.
 
45.
%v7zip%\7z a -tzip "%Pfad%" %1 >nul 
46.
REM Ich bin mit dem Unterprogramm fertig und mache im Hauptprogramm 
47.
REM  (in der Schleife) mit der naechsten Datei weiter. 
48.
goto :eof 
49.
 
[Edit Biber] sieht in Codetags noch schöner aus, [/Edit]
Bitte warten ..
Mitglied: bastla
19.12.2009 um 14:28 Uhr
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 ...
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:
01.
set "v7zip=" 
02.
for /f "tokens=2*" %%a in ('reg query "HKLM\software\7-zip" /v Path 2^>nul') do set "v7zip=%%b" 
03.
if not defined v7zip echo Bitte 7-zip installieren! & goto :eof
Grüße
bastla

P.S.: Noch eine Verbesserungsmöglichkeit: Verwende doch bitte Code-Tags ...
[Edit] Durch Biber (rechts) überholt ... [/Edit]
Bitte warten ..
Mitglied: Redballon
19.12.2009 um 15:18 Uhr
Habe ich auch gleich gemacht. Danke nochmal.
Wegen der Formatierungshilfe. Gelobe Besserung. Mein Browser sollte nur mal renoviert werden. =)
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...