VBS: Zip-Dateien klassifizieren und bestimmt Stelle entpacken
Hallo,
mit dem nachfolgenden Code (clean
) wende ich mich an euch in der Hoffnung, daß mir der eine oder andere weiterhelfen kann und will!
Derzeit bin ich dabei ein eine Batch-Datei in VBS umzuschreiben und stoße mal wieder an meine Grenzen.
In der Batch sieht der betreffende Teil so aus:
Was möchte ich erreichen und wo klemmts:
Im Verzeichnis
\GMD\Data\
habe ich eine Menge Zip-Dateien liegen.
Die, die in einem Workflow bearbeitet werden können sind an den ersten 4 Zeichen zu erkennen, z.B.:
1101 xyz 650.zip
1101 xyz 660.zip
1101 xyz 670.zip
1101 xyz 670 coa.zip
Diese Dateien (es könnten auch nur 3 oder weniger sein) sollen nun mit 7z in bestimmte Ordner, die z.T. schon bestehen entpackt werden.
Die Auswahl der Datei via Input wie oben in der Batch könnte auch entfallen, es müssen halt die ersten in der "Liste" sein.
In der Verzeichnisstruktur bestehen bereits die Ordner:
\gmd\input\raw\
\gmd \input\coa\
Entpackt werden sollen die Dateien nach:
\gmd\input\raw\xyz 650\
\gmd\input\raw\xyz 660\
\gmd\input\raw\xyz 670\
\gmd\input\coa\xyz 670 coa\
D.h.
\xyz 650\
\xyz 660\
\xyz 670\
\xyz 670 coa\
resultieren aus dem Dateinamen und müßten erstellt werden.
Bisher habe ich mich hieran versucht, was evtl. schon in die richtige Richtung geht, aber mit Sicherheit nicht der Weisheit letzter Schluss ist.
Es ist nicht Ausgeschlossen, daß ich mich aber auch total auf dem Holzweg befinde.
Die Syntax zum Entpacken könnte halbwegs richtig sein, zumindest bekomme ich nur den Fehler "Datei nicht gefunden".
Ich würde mich sehr freuen wenn mich jemand in die richtige Richtung schuppsen könnte.
In einem anderen Schritt (muß aber nicht) wäre vieleicht ein Loop ganz sinnvoll.
Also das Script abarbeiten bis zum Schluss, zurück springen und schauen ob es weitere Zip's gib und ggf. das Ganze wieder von vorn beginnen.
Wäre aber auch nur ein schickes Feature - neu starten geht zur Not auch
LG
amn.ssy
P.S. aus gg. Anlass: wie Eingangs schon erwähnt, der Code ist clean!
mit dem nachfolgenden Code (clean
Derzeit bin ich dabei ein eine Batch-Datei in VBS umzuschreiben und stoße mal wieder an meine Grenzen.
In der Batch sieht der betreffende Teil so aus:
set root=%~dp0
set bin=%~dp0bin\
set cfg=%bin%cfg\
set ext=%bin%ext\
set log=%bin%log\
set data=%~dp0data\
set inc=%~dp0input\coa\
set inr=%~dp0input\raw\
set wks=%~dp0temp\
set stxTp=%~dp0store\xls\
set /A cntdata=0
for %%f in (%data%*.zip) do set /A cntdata+=1
if "%cntdata%"=="0" call :ErrorMSG_Zip
set "FirstMonth="
for /f "delims=" %%i in ('dir /b/a-d "%data%"') do if not defined FirstMonth set "FirstMonth=%%~ni"
set "FirstMonth=%FirstMonth:~,4%"
set "LastM="
for /f "delims=" %%i in ('dir /b/a-d "%data%"^|findstr /ibv "%FirstMonth%"') do set "LastM=%%~ni"
set "LastMonth=%LastM:~,4%"
if defined LastM (
echo more than one dataset to process
echo first dataset: "%FirstMonth%"
echo last dataset= "%LastMonth%"
) else (
echo only one dataset to process
echo first dataset: "%FirstMonth%"
)
set In=%wks%\GetInput.vbs
>%In% echo Set args=WScript.Arguments:WScript.Echo InputBox(args(0), args(1))
:Loop
set "ym=" & for /f "delims=" %%i in ('cscript //nologo %In% "Input yymm" "Input Year and Month" ""') do set "ym=%%i"
If not defined ym goto :Loop
call :UnzipMSG
for %%f in (%data%%ym%*.zip) do (
set "fname=%%~nxf"
:: set "prdct=!fname:~5,10!"
if /i "!fname:~-7!" == "coa.zip" (
"%ext%7z" e "%%f" -y -o"%inc%*"
) else (
"%ext%7z" e "%%f" -y -o"%inr%*" @%cfg%zipfilelist.txt
)
) >>NUL
Was möchte ich erreichen und wo klemmts:
Im Verzeichnis
\GMD\Data\
habe ich eine Menge Zip-Dateien liegen.
Die, die in einem Workflow bearbeitet werden können sind an den ersten 4 Zeichen zu erkennen, z.B.:
1101 xyz 650.zip
1101 xyz 660.zip
1101 xyz 670.zip
1101 xyz 670 coa.zip
Diese Dateien (es könnten auch nur 3 oder weniger sein) sollen nun mit 7z in bestimmte Ordner, die z.T. schon bestehen entpackt werden.
Die Auswahl der Datei via Input wie oben in der Batch könnte auch entfallen, es müssen halt die ersten in der "Liste" sein.
In der Verzeichnisstruktur bestehen bereits die Ordner:
\gmd\input\raw\
\gmd \input\coa\
Entpackt werden sollen die Dateien nach:
\gmd\input\raw\xyz 650\
\gmd\input\raw\xyz 660\
\gmd\input\raw\xyz 670\
\gmd\input\coa\xyz 670 coa\
D.h.
\xyz 650\
\xyz 660\
\xyz 670\
\xyz 670 coa\
resultieren aus dem Dateinamen und müßten erstellt werden.
Bisher habe ich mich hieran versucht, was evtl. schon in die richtige Richtung geht, aber mit Sicherheit nicht der Weisheit letzter Schluss ist.
Es ist nicht Ausgeschlossen, daß ich mich aber auch total auf dem Holzweg befinde.
Die Syntax zum Entpacken könnte halbwegs richtig sein, zumindest bekomme ich nur den Fehler "Datei nicht gefunden".
Dim fso, folder, file, ZipParts
lw = Left( WScript.ScriptFullName, 2 )
root = lw & "\gmd"
bin = root & "\bin"
cfg = bin & "\cfg"
ext = bin & "\ext"
lg = bin & "\log"
data = root & "\data"
input = root & "\input"
inc = input & "\coa"
inr = input & "\raw"
ton = chr(007)
ext = "zip"
i = 0
Call Logging ("Start program")
Set fso = CreateObject("Scripting.Filesystemobject")
Set folder = fso.GetFolder(data)
For Each file In folder.Files
If fso.GetExtensionName(file) = ext Then
ZipParts = Split(fso.GetFileName(file)," ")
i = i + 1
End If
Next
If i = 0 Then
Call Logging ("Zip-File(s) not available")
Else
Call Logging ("process " & ZipParts(1) & " of " & ZipParts(0))
End If
Set WshShell = CreateObject("WScript.Shell")
If i > 0 Then
If ZipParts(2) = "coa.zip" Then
WshShell.Run ext & "\7z.exe e " & data & "\" & ZipParts(0)& "*.zip -y -o" & inc & "\" & ZipParts(1) ,0,True
Else
WshShell.Run ext & "\7z.exe e " & data & "\" & ZipParts(0)& "*.zip -y -o" & inr & "\" & ZipParts(1) ,0,True
End If
End If
WshShell.Run "cscript //nologo " & bin & "\getData.vbs " & cfg & "\xyz650.ini",0,true
WshShell.Run "cscript //nologo " & bin & "\getData.vbs " & cfg & "\xyz660.ini",0,true
WshShell.Run "cscript //nologo " & bin & "\getData.vbs " & cfg & "\xyz670.ini",0,true
WshShell.Run "cmd /c @echo " & ton, 0
WshShell.Run bin & "\GMDevents.hta",0,True
Set WshShell = Nothing
Set folder = Nothing
Set fso = Nothing
WScript.Quit
Sub Logging(ByRef sMsg)
Dim oFSO, EventMSG, EventTime
EventTime = Now
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set EventMSG = oFSO.OpenTextFile(lg & "\Events.log",8,true)
EventMSG.WriteLine "[" & EventTime & "] [FlowControl] [Event: " & sMsg & "]"
EventMSG.Close
Set EventMSG = Nothing
Set oFSO = Nothing
End Sub
Ich würde mich sehr freuen wenn mich jemand in die richtige Richtung schuppsen könnte.
In einem anderen Schritt (muß aber nicht) wäre vieleicht ein Loop ganz sinnvoll.
Also das Script abarbeiten bis zum Schluss, zurück springen und schauen ob es weitere Zip's gib und ggf. das Ganze wieder von vorn beginnen.
Wäre aber auch nur ein schickes Feature - neu starten geht zur Not auch
LG
amn.ssy
P.S. aus gg. Anlass: wie Eingangs schon erwähnt, der Code ist clean!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 240386
Url: https://administrator.de/forum/vbs-zip-dateien-klassifizieren-und-bestimmt-stelle-entpacken-240386.html
Ausgedruckt am: 10.05.2025 um 11:05 Uhr
16 Kommentare
Neuester Kommentar

Hallo Uwe!
Naja, zunächst solltest Du in Deinem VB-Script die Codezeile 7 und Codezeile 15 nochmal überdenken
Und wehe Du löschst nochmal einen Deiner Beiträge, dann gibt's was auf die Ohren
Grüße Dieter
Naja, zunächst solltest Du in Deinem VB-Script die Codezeile 7 und Codezeile 15 nochmal überdenken
Und wehe Du löschst nochmal einen Deiner Beiträge, dann gibt's was auf die Ohren
Grüße Dieter

Hallo Uwe!
Von einigen Fehlern mal abgesehen, liegen die *.zip-Dateien nun in
oder in
so würde es zumindest Deine Run-Zeile zum entpacken erwarten? Und wenn ja, woher kommt dann die '1101'?
Grüße Dieter
Von einigen Fehlern mal abgesehen, liegen die *.zip-Dateien nun in
\GMD\Data
\GMD\Data\1101
Grüße Dieter

Hallo Uwe!
OK, mein Fehler, habe ich falsch interpretiert und zwar:
Warum das entpacken aller *.zip nicht funktioniert, ist mir allerdings schon klar...
Grüße Dieter
OK, mein Fehler, habe ich falsch interpretiert und zwar:
data & "\" & ZipParts(0)& "*.zip
'als:
\GMD\Data\1101\*.zip
'anstatt:
F:\gmd\data\1101*.zip
Warum das entpacken aller *.zip nicht funktioniert, ist mir allerdings schon klar...
Grüße Dieter

Hallo Uwe!

Mit der Schleife hast Du schon recht und dass Entpacken läuft bei mir schon, mir ist nur noch unklar, ob die beiden Scripts (vbs, hta) wirklich im Ordner 'Bin' liegen oder nicht doch vielleicht im Ordner 'Ext'?
Für Heute mache ich aber erst mal Schluss
Grüße Dieter
Wie gesagt, ohne wirklich den Plan zu haben: Ich glaub da muß ne Schleife rum, die nur 1101 (also den ersten verfügbaren Packen) abgreift.
Man achte in meinem letzten Kommentar auf das Wort allerMit der Schleife hast Du schon recht und dass Entpacken läuft bei mir schon, mir ist nur noch unklar, ob die beiden Scripts (vbs, hta) wirklich im Ordner 'Bin' liegen oder nicht doch vielleicht im Ordner 'Ext'?
Für Heute mache ich aber erst mal Schluss
Grüße Dieter

Hallo Uwe!
So, sollte es funktionieren:
Grüße Dieter
[edit] 2 Fehler korrigiert [/edit]
So, sollte es funktionieren:
'Main Begin
'Dim...
sLw = Left(WScript.ScriptFullName, 2)
sRoot = sLw & "\gmd"
sBin = sRoot & "\Bin"
sData = sRoot & "\Data"
sInput = sRoot & "\Input"
sCfg = sBin & "\Cfg"
sExt = sBin & "\Ext"
sInC = sInput & "\coa"
sInR = sInput & "\raw"
s7z = sExt & "\7z.exe"
sLog = sBin & "\log\Events.log"
sVbs = sBin & "\GetData.vbs"
sHta = sBin & "\GMDevents.hta"
sQ = Chr(34)
sLogText = GetLogText("start program")
Set oShell = CreateObject("WScript.Shell")
Set oFso = CreateObject("Scripting.Filesystemobject")
iCount = 0
For Each oFile In oFso.GetFolder(sData).Files
If LCase(oFso.GetExtensionName(oFile.Name)) = "zip" Then
aZipParts = Split(oFso.GetBaseName(oFile.Path), " ", 2)
sLogText = sLogText & GetLogText("process " & aZipParts(1) & " of " & aZipParts(0))
If InStr(1, oFile.Name, "coa", vbTextCompare) > 0 Then
sFolderOut = sQ & oFso.BuildPath(sInC, aZipParts(1)) & sQ
Else
sFolderOut = sQ & oFso.BuildPath(sInR, aZipParts(1)) & sQ
End If
CmdLine = sQ & s7z & sQ & " e " & sQ & oFile.Path & sQ & " -y -o" & sFolderOut
oShell.Run CmdLine, 0, True: iCount = iCount + 1
End If
Next
If iCount = 0 Then
sLogText = sLogText & GetLogText("Zip-oFile(s) not available")
oFso.CreateTextFile(sLog).Write sLogText
Else
With oShell
sLogText = sLogText & "?"
oFso.CreateTextFile(sLog).Write sLogText
For Each sName In Array("xyz650", "xyz660", "xyz670")
CmdLine = sQ & sVbs & sQ & " " & sQ & oFso.BuildPath(sCfg, sName & ".ini") & sQ
.Run "cscript.exe " & CmdLine, 0, True
Next
.Run "cmd /c @echo " & Chr(7), 0, False
.Run sQ & sHta & sQ, 0, False
End With
End If
Set oFso = Nothing
Set oShell = Nothing
'Main End
Function GetLogText(ByRef sMsg)
GetLogText = "[" & Now & "] [FlowControl] [Event: " & sMsg & "]" & vbNewLine
End Function
Grüße Dieter
[edit] 2 Fehler korrigiert [/edit]

Hallo Uwe!


Bevor man das noch irgendwie mit einbaut, müsstest Du dir erstmal überlegen, wie Du das in Punkto Ausgabe dann handeln willst?
Grüße Dieter
Die 2 Fehler die du wohl noch korrigiert hast, nehme ich an bezogen sich auf "sCfg" und "Zip-oFile(s)", zumindest war mir das heute früh aufgefallen und ich hab's noch vorm ersten Lauf gefixt.
Knapp daneben, es war einmal das 'sCfg' in der Pfadangabe und das bei mir fehlende 'cscript.exe' für 'GetData.vbs'. Das andere im Log-Text hatte ich sogar noch übersehenWo liegt der Vorteil beim String CMDLine gegenüber WshShell.Run?
Das ist nur der Übersicht wegen (lange Zeilen)Du hast dort auch sQ (CHR(34)) eingeführt. Was macht das ganze, wieso dieser Ansatz?
Die sQ allias Chr(34) sind wichtig, für den Fall, dass Pfadangaben Leerzeichen enthalten, die ja in der Kommandozeile als Argument-Trennzeichen angesehen werdenIch habe rufe\schreibe auch in getData das Logging mit Call Logging ("blablub") auf und "blablub" wird auch geschrieben. Wieso gehst du diesen Weg: sLogText = sLogText & GetLogText("Zip-File(s) not available")?
Naja, das sammeln der einzelnen Meldungen und erst am Ende in die Datei schreiben, verhindert das die Datei mehrmals erneut geöffnet und geschlossen wird. Performance und so...Wenn, wie getestet, dort auch noch 1102, 1103, 1205, usw. liegen, werden rigoros alle Zip-Dateien in die korrekten Order entpackt.
Daran hatte ich auch schon gedacht, aber da Du dies in den Ziel-Ordnern nicht berücksichtigst hast, habe ich es einfach mal ignoriertGrüße Dieter

Hallo Uwe!
OK, ich werde Deinen letzten Kommentar so um die 25 mal durchlesen. Vielleicht kommt dann ja die erhoffte Erleuchtung
In meinem Alter kann das als etwas länger dauern
Grüße Dieter
OK, ich werde Deinen letzten Kommentar so um die 25 mal durchlesen. Vielleicht kommt dann ja die erhoffte Erleuchtung
In meinem Alter kann das als etwas länger dauern
Grüße Dieter

Hallo Uwe!

Grüße Dieter
äh welchen kommentar?
Na, der (Roman) von 11:22 UhrVieleicht kann ich dir ja eine ingeneurmäßige Zeichnung erstellen face-wink
Das wäre der Idealfall, aber dann bitte ingenieurmäßigGrüße Dieter