将文件复制到压缩文件夹

时间:2015-06-29 17:49:22

标签: vbscript zip compression

我正在尝试将现有文件复制到现有的压缩文件夹而不使用任何第三方工具。

我尝试了两种不同的方法但没有一种方法成功。我为我的示例使用了一个文本文件,实际上我需要将Excel文件复制到共享驱动器中的现有压缩文件夹。

第一路(FileSystemObject):

Call MoveToZip()

Function MoveToZip()
    Dim FromPath, ToPath, ObjFSO

    FromPath = "C:\Users\User\Desktop\New_Folder\TestFile.txt"
    ToPath = "C:\Users\User\Desktop\NewCompressed.zip"

    Set ObjFSO = CreateObject("Scripting.FileSystemObject")

    ObjFSO.CopyFile FromPath, ToPath
End Function

第二路(Shell):

Call fnMoveToZip()

Function fnMoveToZip()
    Dim objShell
    Dim objFolder

    Set objShell = CreateObject("shell.Application")
    Set objFolder = objShell.NameSpace("C:\Users\User\Desktop\NewCompressed.zip")

    objFolder.CopyHere("C:\Users\User\Desktop\New_Folder\TestFile.txt")


    Set objShell = nothing
    Set objFolder = nothing
End Function

4 个答案:

答案 0 :(得分:2)

正如@JosefZ在评论中提到的那样:CopyHere方法异步运行,即它立即返回,而不等待复制操作完成。您的解决方法只能起作用,因为您偶然选择了足够长的等待时间来将文件添加到存档中。然而,更好的方法是等到实际添加文件:

Set objShell = CreateObject("shell.Application")
Set objFolder = objShell.NameSpace("C:\Users\User\Desktop\NewCompressed.zip")
cnt = objFolder.Items.Count + 1

objFolder.CopyHere("C:\Users\User\Desktop\New_Folder\TestFile.txt")

While objFolder.Items.Count < cnt
    WScript.Sleep 100
Wend

FileSystemObject方法不起作用,因为FileSystemObject对档案一无所知。 Copy方法只是(尝试)将源文件复制到目标文件上,而不是复制到目标文件中。

答案 1 :(得分:0)

找出我自己的问题的解决方案。在将变量设置为空之前使用:

Wscript.sleep (5000) 

所以它看起来像这样:

Call fnMoveToZip()

Function fnMoveToZip()
    Dim objShell
    Dim objFolder

    Set objShell = CreateObject("shell.Application")
    Set objFolder = objShell.NameSpace("C:\Users\User\Desktop\NewCompressed.zip")

    objFolder.CopyHere("C:\Users\User\Desktop\New_Folder\TestFile.txt")

    'New code
    Wscript.sleep (5000) 

    Set objShell = nothing
    Set objFolder = nothing
End Function

答案 2 :(得分:0)

除了@ ansgar-wiechers的好答案之外,我想强调一个事实,NamespaceCopyHere都需要您可以使用GetAbsolutePathName创建的绝对路径名。无论你放在CopyHere中的任何内容都会出现在ZIP的根级别,因此,如果你想要一个文件夹结构,你必须在使用之前预先准备一个staging文件夹结构。如果您想使用CopyFile从头开始构建ZIP文件,我还建议您使用blank.zip模板ZIP文件。

通过创建任何ZIP文件并删除其内容来准备blank.zip

以下示例从当前工作目录中的hello.zip文件夹创建staging存档。它要求您在当前工作目录中拥有模板blank.zip

Option Explicit

Dim fso, shell, dst
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("shell.Application")

Call fso.CopyFile("blank.zip", "hello.zip")

Set dst = shell.Namespace(fso.GetAbsolutePathName("hello.zip"))
dst.CopyHere(fso.GetAbsolutePathName("staging"))

while dst.Items.count = 0
  WScript.Sleep 100
wend

答案 3 :(得分:0)

即使我需要相同的功能,但我也需要在多个zip中复制相同的文件

Call fnMoveToZip()

Function fnMoveToZip()
    Dim objShell
    Dim objFolder

    Set objShell = CreateObject("shell.Application")
    Set objFolder = objShell.NameSpace("C:\Users\User\Desktop\NewCompressed.zip")
   'here i need reference which will select the path from column A  
    objFolder.CopyHere("C:\Users\User\Desktop\New_Folder\TestFile.txt")    

    'New code
    Wscript.sleep (5000) 

    Set objShell = nothing
    Set objFolder = nothing

End Function