Nur bestimmte Zip-Files entpacken

amn.ssy

Erfahrenes Mitglied
Hallo,

ich versuche derzeit eine Batch in VBS umzuschreiben und habe dabei schon durchaus ein paar Fortschritte gemacht :)
An der Folgenden Sache bleiche ich jedoch hängen:

Code:
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"
  if /i "!fname:~-7!" == "com.zip" (
  "%ext%7z" e "%%f" -y -o"%inc%*"
  ) else (
  "%ext%7z" e "%%f" -y -o"%inr%*" @%cfg%zipfilelist.txt
  )
) >>NUL

Bevor der ab gebildete Code in Aktion tritt werden alle Zip-Dateien ermittelt bei denen jeweils die ersten 4 Zeichen gleich sind und angezeigt. Über ein Input können dann diese 4 Zeichen eingeben werden und 7z entpackt die Dateien analog der zipfilelist in die entsprechenden Ordner.

Nun möchte ich gerne das ganze in VBS überführen und dabei soll folgendes passieren:
- allen Zip-Dateien in \Data ermitteln deren erste 4 Zeichen gleich sind
- analog eines Teil des Dateinames der Zip im vordefinierte Ordner ein Unterordner erstellen und dort entpacken.
- endet der Zip-Name mit com.zip ändert sich der vordefinierte Ordner

Beispiel:
Im Verzeichnis Data liegen z.B 12 Zip-Dateien. Jeweils 4 beginnen mit den gleichen Zeichen
(1101 xyz 650.zip, 1101 xyz 660.zip, 1101 xyz 670.zip, 1101 xyz 670 com.zip)
Nun sollen alle Zip-Dateien die mit 1101 beginnen entpackt werden in die Unterverzeichnisse
\in\raw\xyz 650\, in\raw\xyz 660\, in\raw\xyz 670\, in\com\xyz 670 com\.
Dabei existiert bislang nur das Verzeichnis \in. Die anderen Verzeichnisse wie xyz 650 oder xyz 670 com müßten erstellt werden.

Der Input könnte erstmal entfallen, wichtig wäre daß die ersten passenden Zip-Files entpackt werden.
Im spätern Verlauf, wenn z.B. 1201, 1301, usw. da sind, müßte ich mich um einen Loop über das gesammte Script kümmern. Bis dahin kann man das Programm ja auch neu starten ;-)

Bis jetzt sieht das ganze so aus:

Code:
lw = Left( WScript.ScriptFullName, 2 )
root = lw & "\gmd"
bin = root & "\bin"
cfg = bin & "\cfg"
ext = bin & "\ext"
lg = bin & "\log"
ton = chr(007)

Set WshShell = CreateObject("WScript.Shell")
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

Soviel zur Theorie - leider endets dann auch schon :(

LG
amn.ssy
 
Zuletzt bearbeitet:
Hast du schon Erfahrung mit VBS?
Wie sehen denn deine ersten Versuche für dieses Script aus?

Wenn du eine fertige Version haben willst, denn verschieben wir den Thread zu den Stellenausschreibungen
 
Hallo Yaslaw,

Erfahrungen in VBS hab ich dahingehend was ich im Netz finde und halbwegs verstehe.
Meine ersten Versuche hab ich gerade an den Eingangsthread angefügt.

Ich glaub für 'ne "Stellenausschreibung" reicht nicht ganz ;-)

Gruß
amn.ssy
 
n'Abend!

mit meiner Anfrage hangel ich mich langsam vor:
Code:
Dim fso, folder, file

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"
ext = "zip"
i = 0

Set fso = CreateObject("Scripting.Filesystemobject")
Set folder = fso.GetFolder(data)
ForEach file In folder.Files
If fso.GetExtensionName(file) = ext then
      i = i + 1
   If DataSet = "" then
    DataSet = Left (fso.GetFileName(file),4)
    Product = Mid (fso.GetFileName(file),5,11)
    ProdCoA = Right (fso.GetFileName(file),7)
   Else
   DataSet = DataSet
   Product = Product
   ProdCoA = ProdCoA
   Endif
EndIf
Next

Set WshShell = CreateObject("WScript.Shell")
If i > 0 Then

                WshShell.Run ext & "\7z e " & file & " -y -o" & inc,0,true
Else
                WshShell.Run ext & "\7z e " & file & " -y -o" & inr,0,true
End If
Else
MsgBox"No Zip-File(s)"
EndIf

Das ist bestimmt wahrlich nicht der Weisheit letzter Schluss und geht bestimmt auch noch besser.
Hängen bleib ich jetzt an der korrekten Implementierung und Syntax für 7z.

Gruß
amn.ssy
 
Brrrrr.....

Mich schauderts jedesmal, wenn ich solche verrenkungen sehe.

Wenn die namensstruktur der zip-dateien wie oben im muster erwähnt immer gleich ist (vor allem die leerzeichen!), dann würde ich pro ermitteltem dateinamen die split-funktion nehmen mit leerzeichen als trennzeichen.

Im resultierenden array ist member 0 deine ersten stellen des namens (im beispiel 1101), und im letzten member (UBound-funktion) kann geprüft werden ob die datei auf com.zip endet
 
Hallo Zvoni,

ich sag doch: "ist nicht der Weisheit letzter Schluss!"
Hast du ein Beispiel parat, an dem ich das für meine Anforderung umsetzen kann oder mich dem zumindest etwas näher bringt?

Gruß
amn.ssy
 
Hallo,

ich hab den Vorschlag von "Zvoni" aufgegriffen und umgesetzt:

Code:
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)

ForEach fileIn folder.Files
If fso.GetExtensionName(file) = extThen
            ZipParts = Split(fso.GetFileName(file)," ")
            Pstrenght = Left (ZipParts(2),3)
            i = i + 1
EndIf
Next

If i = 0Then
Call Logging ("Zip-File(s) not available")
Else
Call Logging ("process " & ZipParts(1) & " of " & ZipParts(0))
EndIf

Set WshShell = CreateObject("WScript.Shell")
If i > 0Then
If ZipParts(2) = "com.zip"Then
            WshShell.Run ext & "\7z.exe e " & data & "\" & ZipParts(0)& "*.zip -y -o" & inc & "\" & ZipParts(1) & Pstrenght,0,True
Else
            WshShell.Run ext & "\7z.exe e " & data & "\" & ZipParts(0)& "*.zip -y -o" & inr & "\" & ZipParts(1) & Pstrenght,0,True
EndIf
EndIf

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("F:\GMD\bin\log\Events.log",8,true)

EventMSG.WriteLine"[" & EventTime & "] [FlowControl] [Event: " & sMsg & "]"
EventMSG.Close

Set EventMSG = Nothing
Set oFSO = Nothing
EndSub

Leider bleib ich zum einen immer noch an der 7z Syntax hängen und zum anderen hab ich in ZipParts nur ein Datensatz stehen, nähmlich den letzten ("1101 xyz 670.zip")
Wie bekomme ich im aktuellen Fall die "1101 xyz 650.zip", "1101 xyz 660.zip" und "1101 xyz 670 com.zip" auch noch an Bord?

Gruß
amn.ssy
 
Ich verstehe nicht, was du in zeile 27 erreichen willst.

Und zeile 40 kann nie wahr sein
 
Hallo Zvoni,

in Zeile 27 hole ich mir die Zahl, die am Ende steht, also z.B die 670 von 670.zip
Hinsichtlich der Zeile 40 hast du recht!
Neben der 7z Syntax (evtl. ist Sie sogar schon richtig, da Fehler "kann Datei nicht finden"), liegt mein Problem darin die entsprechenden Zip-Files zusammen zubekommen, die auch zusammen gehören. Im aktuellen Fall sind zwar mehrere Zip's im Ordner, jedoch gehören immer 4 zusammen (die ersten 4 Zeichen sind gleich). Genau diese sollen entpackt werden.

1101 xyz 650.zip
1101 xyz 660.zip
1101 xyz 670.zip
1101 xyz 670 com.zip

Der Ort wohin ergibt sich aus dem Rest vom Dateinamen.
So sollten die Dateien nach:

\input\raw\xyz 650\
\input\raw\xyz 660\
\input\raw\xyz 670\
\input\com\xyz 670 com\

Dabei existiert bislang nur das Verzeichnisse:

\input\raw\
\input\com\

Die anderen Verzeichnisse wie:

xyz 650
xyz 660
xyz 670
xyz 670 com

müßten erstellt werden.

So wie ich das sehe habe ich in ZipParts nur

1101
xyz
670.zip

stehen.

Gruß
amn.ssy
 
Ist mMn eher ein Fall für RegExp (http://msdn.microsoft.com/en-us/library/yab2dx62(v=vs.84).aspx)
Das erstellen der Ordner geht am Einfachsten über das FileSystemObject (also wie du bereits hast)

So grob umrissen:
Visual Basic:
Dim fileName As String
'TODO: Filename setzen
'TODO Ordner Haubtpfad (basisFolderPath) irgendwoher nehmen:
Dim objRegEx: Set objRegExExt= CreateObject("VBScript.RegExp")
Dim objMatches
Dim fso: Set fso = CreateObject("Scripting.Filesystemobject")
Dim folder

'objMatches(0) = Führende Zahl
'objMatches(1) = rest des Namens ohne com
'objMatches(2) = Leer oder com
'objMatches(3) = Dateiendung zip, rar oder 7z

'RegExp Extended. In dem Fall nur für com. Sind da mehrere Spezialordner, dann kann eine Auswahl getroffen werden. zB. anstelle 
'von (com): (com|de|ch)
objRegExExt.Pattern = "^([\d]+) (.+)  (com)\.(zip|rar|7z)$"
If objRegExExt.test(fileName) Then
    'Ist ein Com-Ordner
    Set objMatches = objRegEx.execute(fileName)
    folder = fso.buildPath(basisFolderPath, objMatches(2))  'com hinzufügen
    folder = fso.buildPath(folder , objMatches(1)) 'Rest des Namens hinzufügen
Else
    'RegExp für alle Raw
    objRegEx.Pattern = "^([\d]+) (.+)()\.(zip|rar|7z)$"
    If objRegExExt.test(fileName) Then
        Set objMatches = objRegEx.execute(fileName)
        folder = fso.buildPath(basisFolderPath, "raw")  'raw hinzufügen
        folder = fso.buildPath(folder , objMatches(1)) 'Rest des Namens hinzufügen
    Else
        'TODO: Fehler: Dateiname passt nicht
    End If
End If

If Not fso.folderExist(folder) Then
    fso.createFolder folder
End If

'Todo Zip-File nach folder exportieren
 

Neue Beiträge

Zurück