Windows 7 如何在不创建递归文件夹的情况下提取

Windows 7 如何在不创建递归文件夹的情况下提取,windows-7,vbscript,unzip,Windows 7,Vbscript,Unzip,在Windows7上,我无法使用VBS将递归编码的zip文件解压缩到平面目标目录中。以下是邮政编码的核心部分: objTarget.CopyHere objSource,intOptions 其中,InOptions的值为4096,从该值列表中: 因此,如果zip中的文件通常被提取到一个或多个子文件夹(而不是所选文件夹),则文件将被提取到这些子文件夹。我不必担心文件相互“碰撞”,因为只有几个唯一命名的文件 InOptions的其他值似乎工作正常,例如512,“如果操作需要创建一个新目录,它不会

在Windows7上,我无法使用VBS将递归编码的zip文件解压缩到平面目标目录中。以下是邮政编码的核心部分:

objTarget.CopyHere objSource,intOptions

其中,InOptions的值为4096,从该值列表中:

因此,如果zip中的文件通常被提取到一个或多个子文件夹(而不是所选文件夹),则文件将被提取到这些子文件夹。我不必担心文件相互“碰撞”,因为只有几个唯一命名的文件

InOptions的其他值似乎工作正常,例如512,“如果操作需要创建一个新目录,它不会确认新目录的创建。”

有什么想法吗

*编辑:根据要求,使用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

您需要区分文件和文件夹。提取文件并递归到嵌套文件夹中,例如:

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"

你是救命恩人!我对你的脚本做了一个小小的修改,让它工作起来,并编辑了你的答案。如果您希望我根据您的答案创建我自己的答案,或者如果我弄错了,请让我知道,但是这个轻微的编辑非常有效,我想将您的答案指定为适合我的答案。你是救世主-D@Lizz:您的修改不应该有什么不同(我测试时也没有)。另外,在每次递归中创建一个新的
Shell.Application
对象也是一种资源浪费。一个全局对象就足够了。您之前说的错误是什么?当“设置应用程序…”移到Sub之外或被注释时,我得到错误“需要对象:'应用程序'”,代码为800A01A8。我哪里出错了(@Lizz:这是因为您在过程中有一个
Dim app
。这将创建一个新的局部变量
app
,当您不初始化它时,它将保持为空。移动行
Set app=CreateObject(“Shell.Application”)
到脚本顶部,然后将
Dim obj,app,intOptions
更改为
Dim obj,intOptions
,代码将按预期工作。另一方面,由于您已经将所有变量设置为
Dim
,您还应该在脚本的第一行添加
Option Explicit
。@Lizz:不客气。无需修改在编辑之前,我已经将其回滚了。