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

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

Frage Entwicklung Batch & Shell

Mitglied: alladin107

alladin107 (Level 1) - Jetzt verbinden

02.02.2007, aktualisiert 05.02.2007, 5691 Aufrufe, 4 Kommentare

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%

FOR /F "delims=" %%i in ('dir /b %ausgangsordner%') do rd "%ordner%%%i" /s /q 2>NUL || del "%ordner%%%i" /s /q

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

:endzip

:fileend
Mitglied: bastla
02.02.2007 um 20:03 Uhr
Hallo alladin107 und willkommen im Forum!

Eigentlich sehe ich das Problem nicht (bis auf die Tatsache, dass es eher
01.
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
Bitte warten ..
Mitglied: alladin107
02.02.2007 um 21:22 Uhr
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
Bitte warten ..
Mitglied: bastla
03.02.2007 um 13:24 Uhr
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:
01.
for /f "delims=" %%i in (%importlist%) do call :ProcessFile "%%i" 
02.
goto :Weiter 
03.
:ProcessFile 
04.
set file=%~1 
05.
echo %file% 
06.
:: und hier weiter wie gehabt 
07.
... 
08.
... 
09.
:: wenn die Datei fertig behandelt wurde (also inkl Löschen), das Unterprogramm mit 
10.
goto :eof 
11.
:: abschließen. Danach kannst Du zB mit 
12.
:Weiter 
13.
echo Alle Dateien entpackt 
14.
:: noch andere Befehle anschließen. Diese Stelle im Batch wird erst 
15.
:: 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
Bitte warten ..
Mitglied: alladin107
05.02.2007 um 12:28 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Microsoft Office
gelöst Dropdownlisten in Abhängigkeit mit Leerzeichen im Namen (Datenüberprüfung) (2)

Frage von kevische zum Thema Microsoft Office ...

Batch & Shell
gelöst Alte Daten automatisch per Zip erstellen (4)

Frage von BEBBYs zum Thema Batch & Shell ...

Batch & Shell
gelöst Per Batch Winrar entpacken - Probleme bei Pfad (7)

Frage von Concurve zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...