115129
Goto Top

Script zum Archivieren des Inhalts diverser Verzeichnisse als zip oder rar mit einer Variableübergabe

Guten Abend Community,

ich bin auf der Suche nach einer passablen Lösung meines Vorhabens und hoffe hier, wie auch schon so oft in der Vergangeheit, die passende Lösung zu finden.

Ich brauche ein Script, welches mir alle Dateien in einem "bestimmten" Ordner zu einer .zip oder .rar Datei archiviert.

Ein vorhandenes TCL-Script sollte das neue Script starten, wobei eine Variable (Pfad zu einem bestimmten Verzeichnis) mit übergeben wird.
Nun kommt das neue Script ins Spiel.
Dieses soll nun die Variable auswerten, den kompletten Inhalt des Zielverzeichnis als .zip oder .rar archivieren und prüfen ob das erzeugte Archiv größer als 2GB ist. Ist das erzeugte Archiv kleiner ist alles gut, wenn nicht soll dieses mit Teilarchive gezippt werden.
Die Verzeichnisstruktur spielt ebenso eine Rolle, hier mal eben einige Strukturbeispiele:

Übergebene Variable vom TCL-Script: ----------------------> Pfad wohin archiviert werden soll:
G:\Test1 --------------------------------------------------------------------> K:\Test1
G:\Test2 --------------------------------------------------------------------> K:\Test2
H:\Test4 --------------------------------------------------------------------> K:\Test4
H:\Test5 --------------------------------------------------------------------> K:\Test5
H:\Test6 --------------------------------------------------------------------> K:\Test6
J:\Test7 --------------------------------------------------------------------> K:\Test7
J:\Test8 --------------------------------------------------------------------> K:\Test8
J:\Test9 --------------------------------------------------------------------> K:\Test9

Wäre hierfür Batch oder Visual Basic geeignet?

Vielen Dank schonmal für alle Hilfestellungen.

Gruß,
Blattlaus

Content-Key: 283808

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

Printed on: April 18, 2024 at 02:04 o'clock

Member: bastla
bastla Sep 24, 2015 at 19:32:14 (UTC)
Goto Top
Hallo BlattlausOG!

Da es ja im Prinzip nur darum geht, den Laufwerksbuchstaben (= das erste Zeichen) des übergebenen Parameters durch "K" zu ersetzen und danach das Komprimierungsprogramm mit den passenden Parametern aufzurufen, sollte Batch genügen - etwa so:
@echo off & setlocal
set "Q=%~1"  
if not exist "%Q%" (  
    echo Quelle nicht gefunden!
    goto :eof
)
set "Z=K%Q:~1%"  
echo Komprimiere "%Q%" nach "%Z%"  
:: hier der Aufruf Deines Komprimierungsprogramms
Anstatt zunächst zu komprimieren und dann die Größe zu überprüfen würde ich etwa mit WinRAR einfach gleich die Option "-v2G" verwenden - wenn das Aufteilen nicht nötig ist, wirst Du ja ohnehin nur eine Datei erhalten ...

Grüße
bastla
Mitglied: 115129
115129 Sep 24, 2015 at 22:00:02 (UTC)
Goto Top
Hallo Bastla,

vielen Dank für deine Hilfe.

Ich versuche vergeblichst das WinRAR einzubinden bzw. erst einmal zu testen....

Wenn ich dies ausführe...
@echo off
cd /d C:\Test\1\
for /d %%i in (*.*) do "C:\Program Files\WinRAR\RAR.exe" a -r -v100000 "%%i" "C:\Test\FERTIG\%%i.rar"  
pause


...erhalte ich folgende Meldung:
Kann Testdatei nicht erstellen.
Zugriff verweigert
Programm abgebrochen.
Drücken Sie eine beliebige Taste . . .

Siehst du einen Fehler?

Danke schon mal im voraus.

Gruß,
Blattlaus
Member: bastla
bastla Sep 24, 2015 at 22:20:41 (UTC)
Goto Top
Hallo BlattlausOG!
Siehst du einen Fehler?
Vorweg ganz allgemein: Wenn Du als Zeile 1 (während der Testphase)
@echo on
verwendest, hast Du zumindest eine Chance, Fehler selbst zu sehen. face-wink

Ansonsten solltest Du WinRAR zunächst das Ziel (die zu erstellende Archiv-Datei) und danach die Quelle übergeben ...

Grüße
bastla
Mitglied: 115129
115129 Sep 27, 2015 updated at 10:26:39 (UTC)
Goto Top
Hallo Bastla,

ich bräuchte nochmal dein Rat.

Wenn ich das ausführe...
@echo off & setlocal
set "Q=%~1"  
if not exist "%Q%" (  
    echo Quelle nicht gefunden!
    goto :eof
)
set "Z=K%Q:~1%"  
echo %Q% > "C:\log.txt"  
...erhalte ich den vollen Pfad:
H:/Test1/Test2/Test.csv

Gut, übergeben wird schonmal was, aber ich hätte gerne, dass mir immer nur der letzte Verzeichnisname egal wie lang der Pfad ist, in diesem Fall...
Test2
...von...
H:/Test1/Test2/Test.csv
...in die Batch eingelesen wird.

Wie lautet hierfür der Befehl?

Vielen Dank face-smile

Gruß,
Blattlaus
Member: bastla
bastla Sep 27, 2015 at 10:53:48 (UTC)
Goto Top
Hallo BlattlausOG!

In diesem Fall einfach
for %%i in ("%~1\..") do set "Q=%%~nxi"
Grüße
bastla
Mitglied: 115129
115129 Sep 27, 2015, updated at Sep 28, 2015 at 15:52:42 (UTC)
Goto Top
Hi Bastla,

danke für deine rasche Antwort, kommt mir gelegen da ich grade wieder dran bin.

Das Ergebnis ist dennoch nich das, welches ich gerne hätte. Um selbst nicht durcheinander zu kommen schildere ich was ich versucht habe:

Script ausgeführt mit folgendem Code mit dem Übergabewert vom TCL-Script "H:/Fotos.2011/Fotos.2011-12-11/IMG.RF-0001.nef":
@echo on & setlocal
for %%i in ("%~1\..") do set "Q=%%~nxi"  
if not exist "%Q%" (  
    echo Quelle nicht gefunden! > "C:\log-NICHTS.txt"  
    goto :eof
)
set "Z=K%Q:~1%"  
for /d %%i in ("%Q%\*.*") do "D:\WinRAR\rar.exe" a -m0 -y -r -v15000 "%Z%\%%~nxi.rar" "%%i"  
echo %Q% > "C:\log-q.txt"  
echo %Z% > "C:\log-z.txt"  


Ergbnis in "log-NICHTS.txt":
Quelle nicht gefunden!


Als nächster Schritt folgender Code mit dem Übergabewert vom TCL-Script "H:/Fotos.2011/Fotos.2011-12-11/IMG.RF-0001.nef":
@echo on & setlocal
for %%i in ("%~1\..") do set "Q=%%~nxi"  
echo %Q% > "C:\log-q.txt"  


Ergbnis in "log-q.txt":
Fotos.2011-12-11

Hinweis: Der Übergabename ist individuell, es können -/./Zahlen/Buchstaben/Leerzeichen vorkommen.


Ich versuche dennoch erneut, detailiert zu erklären was genau mein Ziel ist.

1. TCL-Script startet und übergibt eine Variable (Komplette Pfadangabe zu einer Datei) an das Batch-Script
z.B.
H:/Fotos.2011/Fotos.2011-12-11/IMG.RF-0001.nef
H:/Fotos.2011/Fotos.2011-12-11/IMG.RF-0002.nef
G:/Fotos.2012/Fotos.2012-01-19/IMG.RF-0021.nef
G:/Fotos.2012/Fotos.2012-01-19/IMG.RF-0329.nef
J:/Videos-Urlaub/Vid.1995-07-31/IMG.RF-0329.mp4
usw.

2. Das Batch-Script soll nun als Beispiel an dem Pfad (H:/Fotos.2011/Fotos.2011-12-11/IMG.RF-0001.nef) das Verzeichnis (Fotos.2011-12-11), also mit samt Inhalt mit WinRAR nach (K:/Fotos.2011/Fotos.2011-12-11.rar) archivieren bzw. wenn größer als 2GB teilen.
Egal welcher Pfad übergeben wird, es wird immer nach K:/ archiviert.


Bastla, wärst du so lieb und würdest dich für n Bier der Sache nochmal annehemen face-smile

PS: Entschuldige das mit dem Übergabewert, dachte zu Beginn es wird nur der Verzeichnisname übergeben, dabei war es der komplette Pfad.

Gruß,
Blattlaus


EDIT: Ich habe mich nochmal drangewagt und meine bin ein Schritt weiter gekommen.

Übergabewert an die Batch:
H:/Fotos.2011/Fotos.2011-12-11/IMG.RF-0001.nef

@echo on & setLocal
for %%i in ("%~1\..") do set "NAME=%%~nxi"  
for %%i in ("%~1\..\..") do set "DIR=%%~nxi"  
for /d %%i in ("%~1\*.*") do "D:\WinRAR\rar.exe" a -v15000 "K:\%DIR%\%NAME%.rar" "%%i"  
echo %DIR% > "C:\log-DIR.txt"  
echo %NAME% > "C:\log-NAME.txt"  
echo %~1 > "C:\log-PFAD.txt"  

Ausgabe in log-NAME:
Fotos.2011-12-11

Ausgabe in log-DIR:
Fotos.2011

Ausgabe in log-PFAD:
H:/Fotos.2011/Fotos.2011-12-11/IMG.RF-0001.nef


Allerdings hier scheint was falsch zu sein, das archivieren startet nicht:
for /d %%i in ("%~1\*.*") do "D:\WinRAR\rar.exe" a -v15000 "K:\%DIR%\%NAME%.rar" "%%i"  


Findet jemand den Fehler?

Vielen Dank.
Member: bastla
bastla Sep 29, 2015 at 15:28:29 (UTC)
Goto Top
Hallo BlattlausOG!

Da for /d ja nur Verzeichnisse verarbeitet, aber schon in "%~1" ein Dateiname steht, kann natürlich "%~1\*.*" nicht funktionieren ...

Den Quellpfad kannst Du ja aus %1 erhalten, und das Ziel hast Du ohnehin schon zusammengestellt - eine Schleife wäre dann gar nicht mehr nötig:
D:\WinRAR\rar.exe a -v15000 "K:\%DIR%\%NAME%.rar" "%~dp1"
Grüße
bastla
Mitglied: 115129
115129 Sep 29, 2015 at 17:26:32 (UTC)
Goto Top
Hallo Bastla,

danke für deine Antwort, es siehtr immer besser aus.
Das Script archiviert nun wirklich die Bilder....allerdings hab ich noch zwei Punkte:

1. Innerhalb des RAR-Archivs wurde der komplette Pfad erstellt (Fotos.2011/Fotos.2011-12-11/und-alle-.nef-Dateien).
Wäre es möglich "nur" der komplette Inhalt des letzten Verzeichnisses (in diesem Fall "Fotos.2011-12-11") in der RAR vorzufinden?
Hat das was mit ""%~dp1" zu tun? Habe gelesen das sei das erste Argument was an der .bat angehengt ist, also der komplette Pfad.

2. Es wird eine Datei mitgepackt, die ich generell gerne ausschließen würde "meta.txt", wäre dies in das Script noch einbindbar?

Dann sollte das Projekt abgeschlossen sein face-smile

Derzeitiger soweit funktionierender Code:
@echo off & setLocal
for %%i in ("%~1\..") do set "NAME=%%~nxi"  
for %%i in ("%~1\..\..") do set "DIR=%%~nxi"  
D:\WinRAR\rar.exe a -v1900000 "K:\%DIR%\%NAME%.rar" "%~dp1"  

PS: Zu Beginn des Threads hast mir noch "if not exist ..." eingebunden gehabt, das habe ich entfernt weil sonst gar nichts passierte...zur Info.

Vielen Dank und Gruß,
Blattlaus
Member: bastla
Solution bastla Sep 29, 2015 updated at 19:13:40 (UTC)
Goto Top
Hallo BlattlausOG!

Schon mal
D:\WinRAR\rar.exe /?
versucht? face-wink

Deine beiden Zusatzwünsche sollten sich so umsetzen lassen:
echo meta.txt|D:\WinRAR\rar.exe a -v1900000 "K:\%DIR%\%NAME%.rar" "%~dp1" -ep -x@
Wenn Du mehr als eine Datei ausschließen wolltest, müsstest Du eine Textdatei (zB D:\Exclude.txt) erstellen, die unerwünschten Dateien zeilenweise eintragen und die Textdatei so verwenden:
D:\WinRAR\rar.exe a -v1900000 "K:\%DIR%\%NAME%.rar" "%~dp1" -ep -x@D:\Exclude.txt
Grüße
bastla
Mitglied: 115129
115129 Sep 29, 2015 at 19:13:35 (UTC)
Goto Top
Hallo Bastla,

verflixt...es funktioniert und Danke für deine tatkräftige Unterstützung face-smile

Nein, dass wusste ich nicht dass man mit...
D:\WinRAR\rar.exe /?
...an die nötigen Infos kommt, hatte google gefüttert und bekam Informationen, jedoch nicht so ausführlich.

Eine externe "Exclude.txt" ist nicht notwendig.

Vielen Dank nochmals und auf ein ander mal, hoffe ich habe dich nicht zu sehr genervt damit ;)

Schöne Grüße,
Blattlaus