thomas1972
Goto Top

Alle Zip dateien einer Verzeichnisses entpacken (mit Borardmitteln)

Hallo, ich möchte alle Zip Dateien eines Verzecihnisses mit Windows Bordmitteln entpacken

dazu hatte BASLA einen Code für eine einzelne Datei

@echo off & setlocal
set "Quelle=D:\Ein.zip"  
set "Ziel=D:\Entpackt"  

if not exist "%Ziel%\" md "%Ziel%" 2>nul||echo Zielordner "%Ziel%" konnte nicht erstellt werden! & goto :eof  

set "U=%temp%\Unzip.vbs"  
>"%U%" echo CreateObject("Shell.Application").Namespace("%Ziel%").CopyHere CreateObject("Shell.Application").Namespace("%Quelle%").Items, 4 + 16  
cscript //nologo "%U%" 

lasse ich die Endung weg entpackt er leider immer noch nicht alle Dateien eines Verzeichnisses.
Wo muss hier ien Loop oder ähnl. eingebunden werden?

Content-Key: 205732

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

Ausgedruckt am: 19.03.2024 um 03:03 Uhr

Mitglied: 108012
108012 27.04.2013 um 11:21:08 Uhr
Goto Top
Hallo,

kann hier der Fehler Liegen?
set "Quelle=D:\Ein.zip"

Sollte das nicht *.zip sein um alle gepackten Dateien zu entpacken?

Ich meine ich kann keinen Code schreiben aber wäre das eventuell eine Möglichkeit?

Gruß
Dobby
Mitglied: bastla
bastla 27.04.2013 um 11:46:37 Uhr
Goto Top
Hallo thomas1972 und D.o.b.b.y!

Der Code war ja tatsächlich nur für eine Datei gedacht - daher etwa so:
@echo off & setlocal
set "Quelle=D:\" & REM Quellordner mit abschließendem "\" schreiben  
set "Ziel=D:\Entpackt"  

if not exist "%Ziel%\" md "%Ziel%" 2>nul||echo Zielordner "%Ziel%" konnte nicht erstellt werden! & goto :eof  

set "U=%temp%\Unzip.vbs"  
>"%U%" echo CreateObject("Shell.Application").Namespace(WScript.Arguments(1)).CopyHere CreateObject("Shell.Application").Namespace(WScript.Arguments(0)).Items, 4 + 16  
for %%i in ("%Quelle%*.zip") do cscript //nologo "%U%" "%%i" "%Ziel%"  
Grüße
bastla
Mitglied: thomas1972
thomas1972 27.04.2013 um 16:51:49 Uhr
Goto Top
Hallo Bastla,

vielen Dank für die Rückmeldung.
Besteht die Möglichkeit dieses eigentlich auch in VBA ähnlich umzusetzen?.
Problem habe ich nur ,dass die Dateinamen selber keine entdung ZIP haben (umbennen nicht möglich, da die Dateien doppelt gepackt sind und windows dann die dateie nicht mehr richtig erkennt, doppelzip wird aufgehoben und es wird nur eine Datei angezeigt)
Im Moment habe ich mit mit 7za per Batch beholfen. Wollte aber alles in einem VBA Script haben
Mitglied: Biber
Biber 27.04.2013 um 21:20:58 Uhr
Goto Top
[OT]
Zitat von @thomas1972:
...(umbennen nicht möglich, da die Dateien doppelt...
Umbennen finde ich auch unmöglich, ist aber im Forum sehr beliebt... *seufz*

Set /a rgc+=1
#883

Grüße
Biber
[/OT}
Mitglied: bastla
bastla 27.04.2013 aktualisiert um 22:06:31 Uhr
Goto Top
Hallo thomas1972!
Problem habe ich nur ,dass die Dateinamen selber keine entdung ZIP haben
Wollte aber alles in einem VBA Script haben
Welche Informationen wolltest Du dann als nächstes nachliefern? Beschreibe bitte konkret, was Du hast und was Du erreichen willst ...

Falls es übrigens tasächlich so sein sollte, dass eine .zip-Datei Inhalt einer weiteren .zip-Datei (die aber einen anderen Dateityp hat) ist, sollte es mit dem Umbenennen Letzterer auf .zip und anschließendem Entpacken per Script eigentlichen klappen - und da der entscheidende Teil des Scripts ja jetzt schon per VB(S) erledigt wird, ginge das dann ziemlich sicher auch per VBA ...

Grüße
bastla
Mitglied: 108012
108012 27.04.2013 um 22:37:06 Uhr
Goto Top
Hallo nochmal,

Problem habe ich nur ,dass die Dateinamen selber keine entdung ZIP haben
Wieso soll dann der Code eine Datei ansprechen die auf .zip endet?

Meines Erachtens nimmst Du einfach was @bastla Dir geschrieben hat und macht nur einen Schritt in
der Ausführung mehr und das war es dann auch schon.

Also alle Dateien *.zip im Ordner 1 entpacken nach Ordner 2

und dann im zweiten Schritt

Alle Dateien *.zip in dem Ordner 2 entpacken nach Ordner 3

So dann hast Du alles entpackt ob das nun doppelt oder dreifach ist ist ja eigentlich egal man kann den
Schritt ja beliebig erweitern, aber eine Protokolldatei mit dem aktuellen Datum als Namen würde ich mir
an Deiner Stelle immer zusätzlich schreiben lassen in einen Ordner der Protokoll heißt und dann
wenn alle Deine Dekompressionen abgeschlossen sind würde ich ein zweites Script starten lassen was Dir
die Protokolldatei durchsucht und eventuelle Fehler oder den glatten Vollzug meldet und sich immer
am neuesten Datum orientiert.

Gruß
Dobby
Mitglied: colinardo
colinardo 28.04.2013, aktualisiert am 20.05.2013 um 10:59:02 Uhr
Goto Top
Zitat von @thomas1972:
Besteht die Möglichkeit dieses eigentlich auch in VBA ähnlich umzusetzen?.
Problem habe ich nur ,dass die Dateinamen selber keine entdung ZIP haben (umbennen nicht möglich, da die Dateien doppelt
gepackt sind und windows dann die dateie nicht mehr richtig erkennt, doppelzip wird aufgehoben und es wird nur eine Datei
angezeigt)
Im Moment habe ich mit mit 7za per Batch beholfen. Wollte aber alles in einem VBA Script haben

Hallo Thomas,
folgender VBA-Code sollte Dir bei deinem Vorhaben weiterhelfen. Er entpackt in einem weiteren Schritt alle im ersten ZIP enthaltenen weiteren ZIP-Dateien.
Die Variablen lassen sich oben im Script anpassen.
'========Variablen für Anpassung =======  
'Ordner in dem die Dateien liegen  
STARTFOLDER = "C:\temp\zip"  
'Entpackordner  
TARGETFOLDER = "C:\temp\unzip"  
'Erweiterung der Dateien  
FILETYPE = "zip"  
'Auch Dateien in Unterordnern bearbeiten  
RECURSION = False
'=======================================  
Set fso = WScript.CreateObject("Scripting.Filesystemobject")  
Set shell = CreateObject("Shell.Application")  
Set WshShell = WScript.CreateObject("Wscript.Shell")  
TEMPFOLDER = wshshell.ExpandEnvironmentStrings("%temp%") & "\ZipInZip"  
If Not fso.FolderExists(TEMPFOLDER) Then fso.CreateFolder TEMPFOLDER
Set PROCESSFOLDER = fso.GetFolder(STARTFOLDER)
parseFolders PROCESSFOLDER,RECURSION


Function parseFolders(strFldr,boolRecursion)
	For each file in strFldr.Files
		If LCase(Right(file.Name,3)) = LCase(FILETYPE) Then
			Set zipfileitems = shell.NameSpace(file.Path).Items
			For Each f In zipfileitems
				If LCase(Right(f.Name,3)) = "zip" Then  
					shell.NameSpace(TEMPFOLDER).CopyHere f, 4+16
					shell.NameSpace(TARGETFOLDER).CopyHere shell.NameSpace(TEMPFOLDER & "\" & f.Name).Items , 4+16  
					fso.DeleteFile TEMPFOLDER & "\" & f.Name  
				Else
					shell.NameSpace(TARGETFOLDER).CopyHere f, 4+16
				End If
			Next
		End If	
	Next
	
	If boolRecursion Then
		For Each subFolder in strFldr.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function

Set fso = Nothing
Set shell = Nothing
Set wshshell = Nothing

Grüße Uwe
Mitglied: thomas1972
thomas1972 19.05.2013 um 08:26:26 Uhr
Goto Top
Hallo Use,

danke für dein Scrip, hilft mir auf jedenfall deutlich weiter.
Besteht die Möglichkeit in diesem Script noch einzubauen, dass, sobald die erste Zip Datei entpackt wurde, diese dann im Anschluss zu löschen?

Hintergrund

Die Dateien sollen im gleichen Ordner entpackt werden, sollte STARTFOLDER = TARGETFOLDER sein, würde er in einer Schleife bleiben

Daher die Frage ob es möglich ist

entpacke Datei1 -> Datei2 & Datei3
lösche Datei1
entpacke dann erst Datei2 & Datei3 ect..


Für eine nochmalige Hilfe wäre ich dankbar
Mitglied: colinardo
colinardo 20.05.2013 um 11:00:54 Uhr
Goto Top
Hallo Thomas,
Das sollte passen ...
'========Variablen für Anpassung =======  
'Ordner in dem die Dateien liegen  
STARTFOLDER = "C:\Temp\zip"  
'Entpackordner  
TARGETFOLDER = "C:\Temp\zip"  
'Erweiterung der Dateien  
FILETYPE = "zip"  
'Quellzip löschen  
DELETESRC = True
'Auch Dateien in Unterordnern bearbeiten  
RECURSION = False
'=======================================  
Set fso = WScript.CreateObject("Scripting.Filesystemobject")  
Set shell = CreateObject("Shell.Application")  
Set WshShell = WScript.CreateObject("Wscript.Shell")  
TEMPFOLDER = wshshell.ExpandEnvironmentStrings("%temp%") & "\ZipContents"  
If Not fso.FolderExists(TEMPFOLDER) Then fso.CreateFolder TEMPFOLDER
Set PROCESSFOLDER = fso.GetFolder(STARTFOLDER)
parseFolders PROCESSFOLDER,RECURSION

Function parseFolders(strFldr,boolRecursion)
	counter = 0
	Set oDic = CreateObject("Scripting.dictionary")  
	For Each file In strFldr.Files
		If LCase(Right(file.Name,3)) = LCase(FILETYPE) Then
			Set zipfileitems = shell.NameSpace(file.Path).Items
			For Each f In zipfileitems
				If LCase(Right(f.Name,3)) = "zip" Then  
					shell.NameSpace(TEMPFOLDER).CopyHere f, 4+16
					shell.NameSpace(TARGETFOLDER).CopyHere shell.NameSpace(TEMPFOLDER & "\" & f.Name).Items , 4+16  
					fso.DeleteFile TEMPFOLDER & "\" & f.Name  
				Else
					shell.NameSpace(TARGETFOLDER).CopyHere f, 4+16
				End If
			Next
			counter = counter + 1
			oDic.Add counter, file.Path
		End If	
	Next
	If DELETESRC = True Then	
		colKeys = oDic.Keys
		For Each strKey in colKeys
		    fso.DeleteFile oDic.Item(strKey)
		Next
	End If
	
	If boolRecursion Then
		For Each subFolder in strFldr.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function

Set fso = Nothing
Set shell = Nothing
Set wshshell = Nothing

Grüße Uwe