deadwalker
Goto Top

Mehrere Ordner per batch zippen

Hallo Leute,

ich versuche gerade ein kleines Batch Skript schreiben das in einem Verzeichnis alle enthaltenen Ordner jeweils in ein eigenes Zip File (das so heißen soll wie der Ordner) packt.

Also das bedeutet, wenn sich drei Ordner in dem betrachteten Verzeichnis befinden, sollen am Ende 3 zip Files vorhanden sein mit den jeweiligen Ordnernamen.

Ich nutze Win2K kann also nicht auf XP Zip Funktionalität zurückgreifen. Ich arbeite hingegen mit WinZip und den damit angebotenen Kommandozeilenoptionen

Mein Ansatz

@echo off
cls
echo Please stand by: Zipping files.......
echo.

for /F %%i in ('WIE kann ich hier über die Verzeichnisse springen') do @start C:\Program Files\WinZip\WZZIP.exe -rp %%i.zip *.*   
(dies startet den zip per Winzip, der Befehl alleine arbeitet einwandfrei, allerdings bekomm ich ihn nicht richtig in die FOR Schleife eingebunden, keine Ahnung wie man den einbetten muss, mit " oder ' ??)  

@echo on 

Hat jemand von euch eine, Idee, eigentlich fehlen mir ja nur 2 Sachen, der Weg die Verzeichnisse einzeln anzusteuern und das richtige ansprechen des WZZIP Befehls in der FOR Schleife.

Gruß
deadwalker

Content-Key: 64640

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: AndreasA
AndreasA Jul 25, 2007 at 10:43:56 (UTC)
Goto Top
Moin deadwalker
Also das bedeutet, wenn sich drei Ordner in dem betrachteten Verzeichnis befinden, sollen
am Ende 3 zip Files vorhanden sein mit den jeweiligen Ordnernamen.
Also Annahme
Obergeordnetes Verzeichnis=C:\OberDIR
Unterverzeichnis 1=C:\OberDIR\SubDir1
Unterverzeichnis 2=C:\OberDIR\SubDir2
Unterverzeichnis 3=C:\OberDIR\SubDir3
usw....
Zipablageverzeichnis=C:\Zipdir

dann müsste das hier (mal ungetestet) funktionieren
@echo off
cls
echo Please stand by: Zipping files.......
echo.
Set Oberdir=C:\OberDir
Set Zieldir=C:\Zipdir
for /F %%i in ('dir %Oberdir% /b /a:d') do @start C:\Program Files\WinZip\WZZIP.exe -rp %Zipdir%\%%i.zip %Oberdir%\%%i\*.*
@echo on

Gruß Andreas
Member: Deadwalker
Deadwalker Jul 25, 2007 at 13:11:47 (UTC)
Goto Top
Hallo Andreas,

dein Vorschlag funktioniert nach einigen kleinen Anpassungen wirklich Super! Danke dafür

Nur gibt es noch ein kleines Problem, ich versuche nun von der statischen Schiene wegzukommen, es sollte allso immer das aktuelle Verzeichnis als Oberdir gesetzt werden. Das realisiere ich recht gewöhnlich mit %CD% als Umgebungsvariable. Allerdings funktioniert genau das nicht aus dem Batch Skript heraus, (geht nur in der Shell) hier bekomme ich immer C:\WINNT, also den Standardpfad zurück.
Das Skript wird von einem Netzwerkpfad (UNC) gestartet, ich schätze das hier das Problem begründet ist, oder? Glaube mich daran zu erinnern das das Probleme macht.


Außerdem hab ich aber immer noch ein Problem mit den Leerzeichen im Pfad, das Zip Kommando wird nicht erkannt, wie kapsel ich das Ganze denn noch mal sinnvoll. (Sorry das mach ich immer falsch)


Schonmal im Vorraus danke face-wink

Gruß
deadwalker
Member: bastla
bastla Jul 25, 2007 at 13:21:20 (UTC)
Goto Top
Hallo Deadwalker!

In diesem Fall würde sich doch das Ganze reduzieren auf:
for /F "delims=" %%i in ('dir /b /ad') do "C:\Program Files\WinZip\WZZIP.exe" -rp "%%i.zip" "%%i\*.*"  

Grüße
bastla
Member: Deadwalker
Deadwalker Jul 25, 2007 at 13:48:37 (UTC)
Goto Top
Hi bastla,

genau so funktioniert das Ganze, danke!!

Wie gesagt hab ich aber immer noch das Problem das der aktuelle Pfad falsch ausgelesen wird. Ich bekomme immer C:\WINNT zurück, tatsächlich wird das Skript aber aus einem UNC Pfad aufgerufen (also z.B. \\server\skript\zipme.cmd).

Ich glaube genau da liegt das Problem, hab aber im Moment keine Ahnung wie ich das umgehe.
Starte ich das Skript, wird ganz C:\WINNT gezippt face-wink

Danke
Member: bastla
bastla Jul 25, 2007 at 14:15:52 (UTC)
Goto Top
Hallo Deadwalker!

Vielleicht hilft das: http://support.microsoft.com/kb/156276/de

Noch eine Frage: Wie rufst Du den Batch eigentlich auf?

Grüße
bastla
Member: Deadwalker
Deadwalker Jul 25, 2007 at 14:21:15 (UTC)
Goto Top
Hey bastla,

super, ich google ewig und du findest sowas direkt, was mach ich falsch??? face-wink

Die Lösung hört sich gut an, allerdings soll das Skript in der Firma eingesetzt werden und hier darf ich nichts wesentliches an der Registry ändern und außerdem müsste ich das Ganze dann bei allen Nutzern ändern. Daher fällt die Lösung auch weg.

Möglich wäre das anlegen eines netzlaufwerks mit net use und nach getaner Arbeit anschließendes Trennen. Allerdings müsste ich so immer wissen welche Laufwerksbuchstaben noch frei sind. Ist daher auch eher nicht geeignet.

Ach mist, mir fällt nichts anderes ein.

Trotzdem danke!
Member: bastla
bastla Jul 25, 2007 at 14:29:23 (UTC)
Goto Top
Hallo Deadwalker!

Eine Idee hätte ich noch (ist zwar nicht ganz so komfortabel, könnte aber klappen): Gib dem Batch beim Aufruf als Parameter "." mit und füge am Anfang noch folgende Zeile ein:
cd /d "%~dp1"  

was mach ich falsch???
Das kann ich nicht sagen, aber falls Dich der von mir verwendete Suchbegriff (für Google face-wink ) interessiert:
w2000 cmd "UNC-Pfade werden nicht unterstützt."  

Grüße
bastla
Member: Deadwalker
Deadwalker Jul 25, 2007 at 15:10:11 (UTC)
Goto Top
So jetzt mach ich mich mal endgültig zum affen, aber verdammt wie übergeb ich nochma nen Parameter wenn ich das Skript mit Doppelklick starte?
%1 irgendwie so?

Und was bewirkt denn der Befehl? cd /d "%~dp1"

Viele Grüße
Member: bastla
bastla Jul 25, 2007 at 15:31:50 (UTC)
Goto Top
Hallo Deadwalker!

Drum hatte ich oben noch (nachträglich) nach der Startart gefragt ...

Wenn Du den Batch per Doppelklick startest, kannst Du natürlich den "." nicht mitgeben, aber Du könntest einfach einen der zu packenden Ordner auf den Batch ziehen.

Und was bewirkt denn der Befehl? cd /d "%~dp1"
Mit dem Schalter "/d" kann der "cd"-Befehl auch gleich das Laufwerk wechseln, und "%~dp1" steht für Laufwerk (drive) und Pfad des ersten Parameters (was gleichbedeutend mit dem "beinhaltenden" Ordner ist).

Dann würde sich übrigens zur Sicherheit im Batch vorweg zumindest noch ein
if not exist %1 goto :eof
empfehlen, damit der Batch wirklich nur ausgeführt wird, wenn ein Ordner übergeben (und nicht mit bloßem Doppelklick gestartet) wurde.

Grüße
bastla
Member: Deadwalker
Deadwalker Jul 25, 2007 at 15:50:43 (UTC)
Goto Top
Hi bastla,

ja also hab das Ganze getestet und es nimmt jetzt zwar nicht mehr C:\WINNT an sondern H:\ (ein Netzlaufwerk) aber helfen tut das nicht. Ich kapiers einfach net, ich glaub ich mach das gleich mit VBS.

Trotzdem danke für all deine Hilfe, hast dir nen Bier verdient!
Member: AndreasA
AndreasA Jul 25, 2007 at 15:55:17 (UTC)
Goto Top
So jetzt mach ich mich mal endgültig zum
affen, aber verdammt wie übergeb ich
nochma nen Parameter wenn ich das Skript mit
Doppelklick starte?
%1 irgendwie so?

Und was bewirkt denn der Befehl? cd /d
"%~dp1"

Viele Grüße


Ohman deadwalker,

du solltest doch bastla's frage beantworten wie du den Batch aufrufen willst!!! Und vorallem wo du die Zip-dateien hinschieben willst?

hier noch mal mein Ansatz von oben etwas modifizierter
-------schnipp zipme.cmd---------------------------
@echo off
cls
echo Please stand by: Zipping files.......
echo.
:main
springe von ein Verzeichnis zum nächsten mittels CD
...und rufe jeweils mittels call :zipsubdir . die Ziproutine auf
... eventuelle weiterverarbeitung
goto :EOF

:zipsubdir
Set Oberdir=%1
Set Zieldir=C:\ZIPTEMP
SET zip_prog=C:\Programme\WinZip\WZZIP.exe

for /F %%i in ('dir %Oberdir% /b /a:d') do (@start %zip_prog% -rp %Zieldir%\%%i.zip %Oberdir%\%%i\*.*)
goto :EOF
ende schnipp---------------------------------
Zu deiner Frage hätte ein einfaches cd /? an der Console geholfen und mit "%dp1" springt dein Script dann in das Übergebene Verzeichnis von %1 (in diesem Falle halt das aktuelle durch "." gekennzeichnete)

Im Falle meiner Lösung müsstest du entweder dieses Script mit einer Main-Prozedur erweitern, die durch deine gewünschten Verzeichnisse springt oder du hast ein obergeordnetes Script, welches dieses Batch dann aufruft mittels \\server\script\zippme.cmd "." (aber die Anführungszeichen weglassen !!!)

Um flexibel zu bleiben, kannst du alternativ auch noch ein Zieldir als %2 übergeben und in diesem Schnippsel.cmd die Zeile Set Zieldir=C:\ZIPTEMP durch SET Zieldir=%2 ersetzen.

So long Andreas

PS bei mir funktioniert das auch mit Leerzeichen und UNC-Pfaden
Member: Deadwalker
Deadwalker Jul 25, 2007 at 16:22:57 (UTC)
Goto Top
Danke Super Tipps von euch beiden. Hab mich letzten Endes für die Lösung von bastla entschieden.
Virtuelles Bier ausgeb!

@andreas: Deine Lösung erscheint mir auch sinnvoll, muss für meine Zwecke allerdings nicht so "komplex" sein.
Ach noch was: cd /? liefert zumindest bei mir keine Infos darüber was "%~dp1" macht. face-wink
Und dazu wie ich mein Skript Aufrufe hab ich bastla nicht geantwortet weil er das nachträglich editiert hat und ich das beim verfassen meiner Antwort nicht gesehen hab.

Naja jetzt läufts und dafür bin ich dankbar.

Thx
deadwalker