alladin107
Goto Top

Zip-Files in Abhängigkeit des Dateinamens in zeitlicher Reihenfolge entpacken

Hallo admin Team,

ich bin neu hier, aber von Eurer Seite total begeistert. Hier findet man echt viele
Tipps und Lösungen. Hoffentlich auch für mein Anliegen. Das muss ich aber jetzt erst
mal kurz erläutern, ist leider viel Text, sorry.

Derzeit bekomme ich auf einem W2k3 SP1 Server in einen Ordner täglich ein Zipfile gelegt, welches
automatisch in einen vorhandenen Ordner entpackt werden muss. Das File hat folgenden Aufbau:

JJJJMMMM_Zeit_Modus.zip

Also z.B.
20061012_1820_Voll.zip oder
20061120_1050_Halb.zip.

Bei den "Voll" Versionen wird vorher noch der Zielordner geleert, bei den "Halb" Versionen
wird einfach überschrieben.
Da allerdings die Datei mitunter sehr groß werden kann, wird am Ende der Übertragung eine
zugehörige "Ich bin fertig mit kopieren" Datei im Format:
new.content2.JJJJMMMM_Zeit angelegt. Erst wenn diese Datei vorhanden ist, wurde das Zipfile
komplett übertragen und ich darf entpacken. Wenn diese Datei nicht vorhanden ist, passiert
auch nix.
Bisher ist das Ganze nicht so schwierig, dafür habe ich auch schon ein Skript erstellt, welches
automatisch einmal nachts ausgeführt wird. Das Skript ist zwar nicht sehr elegant und schön, tut
aber seinen Dienst. Das Skript ist unten angehängt.

Neu ist jetzt, das ich mehrere Zipfiles am Tag bekommen werde. Diese muss ich jetzt in zeitlich
korrekter Reihenfolge entpacken. Also könnte mein Eingangsordner z. B. so aussehen:

20070112_1050_Halb.zip
new.content2.20070112_1050

20070112_1220_Voll.zip
new.content2.20070112_1220

20070112_1750_Halb.zip
new.content2.20070112_1750

20070112_1815_Halb.zip

In diesem Fall dürfte ich die Datei "20070112_1815_Halb.zip" noch nicht entpacken, da die zugehörige
"Ich bin fertig mit kopieren" Datei fehlt. An den Grundanforderungen (Halb=überschreiben, Voll=löschen
und entpacken, berücksichtigen der "Ich bin fertig mit kopieren" Datei) hat sich nix geändert.
Den Zeitstempel der Zipfiles kann ich leider nicht als Kriterium verwenden, es muss der Dateiname sein.

Bei dem obigen Beispiel müsste also folgendes passieren.
1.) entpacken der Datei 20070112_1050_Halb.zip, überschreiben des Zielordners (eigentlich überflüssig wegen 2.)
2.) entpacken der Datei 20070112_1220_Voll.zip, vorher aber Inhalt des Zielordners löschen
3.) entpacken der Datei 20070112_1750_Halb.zip, überschreiben des Zielordners
4.) nix, da die Datei 20070112_1815_Halb.zip offensichtlich gerade noch kopiert wird.

Hier bin ich leider mit meinen Batch-Grundkenntnissen am Ende. Ich hoffe mal Ihr könnt mir hier weiterhelfen.
Schon mal vielen Dank.

Gruß alladin107

Hier mein bestehendes Skript:

@echo off

setlocal enableDelayedExpansion
set transfer=1
set ausgangsordner=C:\temp\teaseroutput\
set eingangsordner=C:\TEMP\teaserimport\
set importlist=C:\temp\importlist.txt

REM Zip File in Datei schreiben
cd\
cd %eingangsordner%
dir *.zip /o:n /b >%importlist%

REM Variable "file" setzen auf Zip Datei
for /f "delims=" %%i in (%importlist%) do (set file=%%i) & echo !file!

REM Die ersten 12 zeichen lesen von variable "file"
set timestamp=%file:~0,13%
echo %timestamp%

REM Pruefen ob Filetransfer komplett ist
if not exist "new.content2.%timestamp%" set transfer=99
if %transfer%==99 echo "Filetransfer von %file% noch nicht abgeschlossen" & goto transferincomplete

goto checkmode

:transferincomplete
echo Filetransfer noch nicht abgeschlossen
goto fileend

:checkmode
REM Modus ermitteln aus variable "file"
set transfermode=%file:~9,4%
echo Transfermodus=%transfermode%

if %transfermode%==Voll echo "Kompletter Datensatz uebertragen" & goto transfervoll

:transferhalb
echo Transfer-Halb
REM Entpacken des Zipfiles im Halb-Modus
cd\
cd %ausgangsordner%
pkzipc -extract -overwrite=all %eingangsordner%\%file%

goto endzip

:transfervoll
echo Transfer-Voll
REM Loeschen des Ausgangsordners bevor die neuen dateien extrahiert werden
cd\
cd %ausgangsordner%


REM Entpacken des Zipfiles im Voll-Modus
cd\
cd %ausgangsordner%
pkzipc -extract -overwrite=all %eingangsordner%\%file%

:endzip

:fileend

Content-Key: 50575

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

Printed on: April 25, 2024 at 20:04 o'clock

Member: bastla
bastla Feb 02, 2007 at 19:03:15 (UTC)
Goto Top
Hallo alladin107 und willkommen im Forum!

Eigentlich sehe ich das Problem nicht (bis auf die Tatsache, dass es eher
set transfermode=%file:~<b>14</b>,4%
heißen sollte).

Deine Sortierung nach Dateinamen ("/o:n") klappt ja auch bei mehreren Dateien pro Tag, und da ohnehin all .zip-Files in der "%importlist%" landen, wird auch keine übersehen.

Ansonsten frage ich mich nur noch: Wie / wann werden die entpackten .zip-Files samt zugehörigen "Ich bin fertig mit kopieren"-Dateien eigentlich gelöscht?

Grüße
bastla
Member: alladin107
alladin107 Feb 02, 2007 at 20:22:06 (UTC)
Goto Top
Hallo bastla,

danke für die schnelle Antwort.

Bei dem
set transfermode=%file:~14,4%
hast Du natürlich recht. Das ist wohl von diversen Tests noch übrig geblieben.

Das Löschen der Zipfiles, der "Ich bin fertig mit kopieren" Datei und ein paar echo
Meldungen in ein Logfile kommt nach dem :fileend mit einem ganz einfachen del
Aufruf. Ich wollte den Artikel hier aber nicht noch länger machen als eh schon und
habs abgeschnitten. Sorry.

Das Skript funktioniert derzeit leider nur mit einem Zipfile, da die Variable "file"
nur mit der letzten Zeile aus der %importlist% gefüllt wird.
Anschließend wird das Ganze ja auch nur einmal ausgeführt, und nicht für jedes
Zipfile.
Den Timestamp der Zipfiles darf ich leider auch nicht als Sortierkriterium
verwenden. Es ist durchaus möglich das ein Zipfile mit älterem Timestamp aktuelleren
Inhalt hat als eine neuere Zipdatei. Das liegt daran, das die Files von unterschiedlichen
Servern und Personen kommen.

Müsste das Ganze nicht über mehrere Schleifen realsiert werden, um alle Files zu
entpacken? Ich weiß leider nicht wie das dann mit dem sortieren nach Uhrzeit und
Modus realisieren lässt.

Grüße
alladin107
Member: bastla
bastla Feb 03, 2007 at 12:24:16 (UTC)
Goto Top
Hallo alladin107!

Das Skript funktioniert derzeit leider nur mit einem Zipfile, da die Variable "file" nur mit der letzten Zeile aus der %importlist% gefüllt wird.
Stimmt leider, lässt sich aber so beheben:
for /f "delims=" %%i in (%importlist%) do call :ProcessFile "%%i"  
goto :Weiter
:ProcessFile
set file=%~1
echo %file%
:: und hier weiter wie gehabt
...
...
:: wenn die Datei fertig behandelt wurde (also inkl Löschen), das Unterprogramm mit
goto :eof
:: abschließen. Danach kannst Du zB mit
:Weiter
echo Alle Dateien entpackt
:: noch andere Befehle anschließen. Diese Stelle im Batch wird erst
:: nach dem Durchlaufen der "for"-Schleife (siehe oben) erreicht. 
Noch kurz zum %~1: Das mit Call aufgerufene Unterprogramm verhält sich wie eine eigene Batch-Datei und übernimmt daher die beim Aufruf übergebenen Argumente mit %1, %2, ... Das "~" dient dem Entfernen der einschließenden Anführungszeichen (siehe call :ProcessFile "%%i"), die in diesem Fall eigentlich nicht erforderlich wären, da Du ja keine Pfadangaben oder Dateinamen mit Leerstellen verwendest.

Den Timestamp der Zipfiles darf ich leider auch nicht als Sortierkriterium verwenden.
Du meinst damit aber nicht den in den Dateinamen codierten %timestamp%, und daher berücksichtigt das Sortieren nach dem Dateinamen auch automatisch die Uhrzeit.

Nach dem Modus zu sortieren bzw besser erst beim letzten vollständigen "Voll" in der sortierten Liste zu beginnen, wäre sicher eine Überlegung wert, obwohl natürlich der oben von Dir beschriebene Ablauf 1.) bis 4.) zwar uU einige überflüssige Entpackvorgänge nach sich zieht, aber zum richtigen Endergebnis führen sollte.

Grüße
bastla
Member: alladin107
alladin107 Feb 05, 2007 at 11:28:29 (UTC)
Goto Top
Hallo bastla,

danke für den Tipp. Funtioniert einwandfrei!!

Den Timestamp der Zipfiles darf ich leider auch nicht als Sortierkriterium verwenden.

Richtig, damit meinte ich den Zeitstempel der Datei, nicht den im Dateinamen enthaltenen
%timestamp%.

Das mit dem sortieren nach dem letzten "Voll" ist vielleicht noch mal eine Fleißaufgabe.
So funktioniert es aber auch sehr gut.

Danke nochmal für die Hilfe.

Gruß
alladin107