Batch mehrere (Sub)Ordner mit bestimmtem Namen zippen

Niicoo

Newbie
Registriert
März 2016
Beiträge
2
Hallo,

als batch-Neuling benötige ich Hilfe bei folgender Aufgabenstellung:

Ich habe einen Basisordner (Basedir), den ich als Parameter an ein Batchfile übergeben möchte. Dieser Ordner und Subordner (mit unbekanntem Namen) können einen Ordner mit einem bestimmten Namen enthalten ("Tomogram"). Ist ein solcher Ordner vorhanden, möchte ich den Inhalt dieses Ordners mit 7zip packen.

Ich versuche das hier deutlich darzustellen:

Basedir
|_
| Tomogram <- Inhalt packen
|_
| Sub1
| |_
| |_ Tomogram <- Inhalt packen
| | Sub11
| |_
|_ Tomogram <- Inhalt packen
| Sub2
|_
| Sub3
|_
Tomogram <- Inhalt packen


Mein Code (mit Hilfe von diesem Forenthread):

Code:
@set path="C:\Program Files\7-Zip\";%path%

Setlocal EnableDelayedExpansion

color 0F

set basedir=%1
cls

for /R "%basedir%" /D %%a in (*Tomogram) do (

echo %%a
set folder=%%a
echo aktueller Ordner: !folder!
pause
		
		7z.exe a !folder!\Tomogram.zip !folder!\*.tif
			IF  "%errorlevel%"=="0" (goto testzip) ELSE (goto zipfail)	
		:testzip
			7z.exe t !folder!\Tomogram.zip
			IF  "%errorlevel%"=="0" (goto delfiles) ELSE (goto testzipfail)
		
		:delfiles
rem			del %%a\*.tif
rem			IF  "%errorlevel%"=="1" (goto delfail)
			)

goto Success


Ich scheitere daran, dass er alle Ordner packt. Wenn ich alle 7z.exe-Zeilen auskommentiere listet er mir mit "echo aktueller Ordner: !folder!" alle "Tomogram"-Ordner auf. Aktiviere ich aber das packen, macht er beim Testlauf mit 2 Unterordnern "Tomogram" nur einen der beiden Pack- und Test-Jobs wie gewünscht und verlässt die Schleife.

Bitte unterstützt mich bei diesem Problem, wenn noch Informationen fehlen, reiche ich diese gerne nach.

Gruß
Niicoo
 
Ich habe shcon lange nichts mehr mit Batch Dateien gemacht, aber wenn die Schleife doch funktioniert. Und das scheint sie ja, wenn du das 7zip außen vor lässt, dann kann es ja nur am 7zip liegen.

Da fiele mir auf Anhieb nur eines ein, ergänze mal um ein:
Code:
...
echo %errorlevel%
IF "%errorlvel"== ...

Nur durch die IFs kommt er ja aus der Schleife.



Gruß
Kai


[Edit:]

Ach...das mit dem errorlevel Check ist so nicht korrekt, wenn ich nochmal darüber nachdenke.

Code:
If errorlevel  0 (...)

Das sollte die korrekt Syntax sein. Anders fragst du die Umgebungsvariable %errorlevel% ab.
 
Zuletzt bearbeitet:
Ich habe leider gerade nicht viel Zeit es auszuarbeiten.
Hier kurz meine Idee zu deinem Problem.

Code:
for /f "tokens=*" %%X in ('dir Tomogram /b /a:d /s') do echo "C:\Program Files\7-Zip\7z.exe" a "%%X\Tomogram.7z" "%%X\*.tif"
 
Hallo kaikuwe und bauers,

vielen Dank für Eure Tipps, ihr habt mich beide weitergebracht! Super!

Ich bin inzwischen hier:

Code:
@set path="C:\Program Files\7-Zip\";%path%
Setlocal EnableDelayedExpansion
color 0F

rem chdir %1

for /f "tokens=*" %%X in ('dir Tomogram /b /a:d /s') do (
	7z.exe a "%%X\Tomogram.zip" "%%X\*.tif"
	IF  "%errorlevel%" NEQ "0" (goto zipfail)
	7z.exe t "%%X\Tomogram.zip"
	IF  "%errorlevel%" NEQ "0" (goto testzipfail)
	del %%X\*.tif
	IF  "%errorlevel%" NEQ "0" (goto delfail)
	)
goto Success

Ich habe die If-Abfragen so umformuliert, dass, wenn alles iO ist, kein goto verwendet wird, dann führt er alle Zip-, Test- und Lösch-durchgänge wie gewollt durch.

Ein Problem habe ich noch: Er führt das packen jetzt für alle Ordner durch, die im Ordner des Skripts liegen. Er soll jedoch nur innerhalb der Unterordner des Ordners den ich dem .bat als Parameter übergebe arbeiten.

Aktiviere ich vorab das oben auskommentierte
Code:
chdir %1
, packt er nicht mehr. Hat hier jemand eine Lösung?
Ergänzung ()

Ich hab's hinbekommen:

Code:
@set path="C:\Program Files\7-Zip\";%path%
Setlocal EnableDelayedExpansion
color 0F

for /f "tokens=*" %%X in ('dir %1\*Tomogram /b /a:d /s') do (
	7z.exe a "%%X\Tomogram.zip" "%%X\*.tif"
	IF  "%errorlevel%" NEQ "0" (goto zipfail)
	7z.exe t "%%X\Tomogram.zip"
	IF  "%errorlevel%" NEQ "0" (goto testzipfail)
	rem del %%X\*.tif
	IF  "%errorlevel%" NEQ "0" (goto delfail)
	)
goto Success

Vielen Dank für die Unterstützung!
 
Hallo zusammen,
ich bin ein kompletter Neuling was Batch-Dateien anbelangt.
ich habe genau das gleiche Problem.
Die Lösungen haben mir auch schon weiter geholfen.

Es werden verschiedene Unterordner durchsucht. Die Überordner haben wechselnde Namen, aber es gibt immer den Report Order darin (manchmal auch eine Ebene tiefer)

Code:
for /f "tokens=*" %%X in ('dir Report /b /a:d /s') do (
	"C:\Program Files\7-Zip\7z.exe" a  "%%X\Report.zip " "%%X\*.*"

Jetzt wird aber die Zip-Datei immer direkt in den Report-Ordner gepackt. Ich möchte den aber aber eine Ebene höher haben, im Prinzip so, dass ich den Ursprungsordner dann löschen kann und an derselben Stelle das Zip-File habe.

Das mit dem %1 funktioniert leider bei mir nicht.
Die Batch-Datei liegt aber im obersten Ordner, das heißt wenn ich das %%X weg nehme, liegt die Zip-Datei auch im obersten Ordner. Wie kann ich diesen denn genau um die eine Ebene nur nach oben schieben.


Kann mir denn jemand helfen?

Schöne Grüße und Danke
 
Hi, am einfachsten
Code:
for /f "tokens=*" %%X in ('dir Report /b /a:d /s') do (
	"C:\Program Files\7-Zip\7z.exe" a  "%%X\..\Report.zip " "%%X\*.*"
Die zwei Punkte symbolisieren das übergeordnete Verzeichnis.

Edit: So nebenbei, bei mir erstellt 7zip übrigens ein 7z-Archiv, wenn ich einfach nur a verwende. Für zip müsste es "a -tzip" heißen.
 
Zuletzt bearbeitet:
Hi,
Super funktioniert! Vielen lieben Dank.
Das mit den Punkten kannte ich, nur hab ich immer versucht die ganz vorne hinzuschreiben :rolleyes:
Bei mir hat das mit .zip funktioniert, aber ich hab es trotzdem mal noch geändert
Wie genau kann ich jetzt den Ursprungsordner (den nicht gezippten) löschen?
Das wäre meine Idee. Das funktioniert leider nicht konsequent.

Code:
for /f "tokens=*" %%X in ('dir Report /b /a:d /s') do (
	"C:\Program Files\7-Zip\7z.exe" a -tzip  "%%X\..\Report.zip" "%%X\*.*"
	if exist "%%X\..\Report.zip" rd /S /Q "%%X"
	)

Danke schon mal und viele Grüße
 
Also bei mir funktioniert das Löschen wie du es da drin hast. Kann dir da also nicht viel weiterhelfen.
Du musst halt mal schauen, was in den Fällen, in denen das Löschen nicht funktioniert anders ist als in den Fällen, in denen es funktioniert. Vielleicht steht ja irgendwas in der Ausgabe.
 
Hallo,
danke nochmal.
Wenn ich das ganze in 2 for Schleifen packe funktioniert's ohne Probleme,
Kann es sein, dass das Löschen schon probiert wird wenn die .zip noch nicht fertig erstellt wurde?

Schöne Grüße und bis zum nächsten Mal ;)
 
Wäre denkbar. Normalerweise müsste die Batch aber warten, bis 7-Zip fertig ist. In dem Fall funktioniert es ja dann, das Löschen in einer zweiten Schleife vorzunehmen. Sonst hättest du noch zwischen den beiden Befehlen einen Wartebefehl einbauen können. Naja, Hauptsache es läuft.

Viele Grüße dann auch von mir.
 
Zurück
Oben