我正在尝试将现有文件复制到现有的压缩文件夹而不使用任何第三方工具。
我尝试了两种不同的方法但没有一种方法成功。我为我的示例使用了一个文本文件,实际上我需要将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
答案 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的好答案之外,我想强调一个事实,Namespace和CopyHere都需要您可以使用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