2014-07-01 7 views
0

Je n'ai pas été en mesure d'extraire un fichier zip codé récursive dans un répertoire cible plat VBS sur Windows 7. Voici la partie centrale du code d'extraction zip:Comment extraire sans créer des dossiers récursifs

objTarget. CopyHere objSource, intOptions

où intOptions est donné la valeur de 4096, à partir de cette liste de valeurs: http://www.robvanderwoude.com/vbstech_files_zip.php#CopyHereUNZIP

Alors, où les fichiers du zip sont normalement extraits à un ou plusieurs sous-dossiers (au lieu du dossier sélectionné), les fichiers extraient dans ces sous-dossiers. Je n'ai pas à m'inquiéter du fait que les fichiers se «tabassent» les uns les autres, car il n'y a que quelques fichiers nommés de façon unique.

D'autres valeurs pour intOptions semblent fonctionner correctement, comme 512, qui ne "confirme pas la création d'un nouveau répertoire si l'opération en nécessite la création".

Des idées?

* Edit: script de travail complet ci-dessous, sur demande, en utilisant la réponse de Ansgar *

Dim strCurrentFolder, ExtractTo, strCurrentZip, src, dst, fso, strFileName, app 

strCurrentFolder = Replace(WScript.ScriptFullName,WScript.ScriptName,"") ' Path where script is running 
ExtractTo = strCurrentFolder & "temp1" 
WScript.Echo ExtractTo 
strFileName = "samplefile.zip" 



'If the extraction location does not exist create it. 
Set fso = CreateObject("Scripting.FileSystemObject") 
If NOT fso.FolderExists(ExtractTo) Then 
    fso.CreateFolder(ExtractTo) 
End If 

'Unzip "C:\path\to\your.zip", "C:\output\folder" 
Unzip strCurrentZip, ExtractTo 

WScript.Quit 



Sub Unzip(src, dst) 
' Function to extract all files from a compressed "folder" 
' (ZIP, CAB, etc.) using the Shell Folders' CopyHere method 
Dim obj, app, intOptions 
Set app = CreateObject("Shell.Application") 


' Loop through zipped "subfolders" 
' http://stackoverflow.com/a/24515198/1569434 
    For Each obj In app.NameSpace(src).Items 
     If obj.IsFolder Then 
    'WScript.Echo "Recursing into nested folders..." 
    Unzip obj.Path, dst    'recurse into nested folders 
    Else 
    'WScript.Echo "Extracting files" 
    app.NameSpace(dst).CopyHere obj 'extract files, not using intOptions right now 
    End If 
    Next 
End Sub 

Répondre

1

Vous devez faire la distinction entre les fichiers et dossiers. Extrayez les fichiers et recyclez-les dans les dossiers imbriqués, par ex. comme ceci:

Set app = CreateObject("Shell.Application") 

Sub Unzip(src, dst) 
    For Each obj In app.NameSpace(src).Items 
    If obj.IsFolder Then 
     Unzip obj.Path, dst    'recurse into nested folders 
    Else 
     app.NameSpace(dst).CopyHere obj 'extract files 
    End If 
    Next 
End Sub 

Unzip "C:\path\to\your.zip", "C:\output\folder" 
+0

vous êtes un * sauveteur *! J'ai fait un léger mod à votre script pour le faire fonctionner, et j'ai édité votre réponse. Si vous préférez que je crée ma propre réponse à partir de la vôtre, ou si je me suis trompé, SVP faites le moi savoir, mais cette légère modification fonctionne parfaitement et je voulais attribuer le vôtre comme la réponse qui a fonctionné pour moi. Tu es un sauveur! :-D – Lizz

+0

@Lizz: Votre modification ne devrait pas faire de différence (et ne l'a pas fait quand je l'ai testé). Aussi, c'est une perte de ressources pour créer un nouvel objet 'Shell.Application' avec chaque récursivité. Un objet global devrait suffire. Quelle erreur avez-vous dit que vous receviez avant? –

+0

Lorsque "Définir l'application ..." est déplacé en dehors de Sub ou commenté, je me trompe "Objet requis: 'app'" avec le code 800A01A8. Où est-ce que je me suis trompé? :( – Lizz

Questions connexes