仅将jpg文件从文件夹和子文件夹移动到另一个文件夹而不重复

时间:2013-04-19 04:11:09

标签: vbscript move filesystemobject

我使用以下脚本将所有特定文件移动到目标文件夹。我想将文件复制到目标文件夹而不重复。

由于我计划每10分钟运行一次VBS,因此不应再次复制文件夹中已存在的相同文件。

Set fso = CreateObject("Scripting.FileSystemObject")

testfolder = "D:\env"
'fso.CreateFolder(testfolder)

MoveFiles fso.GetFolder("D:\Movie Keys\License\2013_Apr_19")

Sub MoveFiles(fldr)
    For Each f In fldr.Files
        basename  = fso.GetBaseName(f)
        extension = fso.GetExtensionName(f)

        If LCase(extension) = "env" Then
            dest  = fso.BuildPath(testfolder, f.Name)
            count = 0
            Do While fso.FileExists(dest)
                count = count + 1
                dest  = fso.BuildPath(testfolder, basename & "_" & count & "." _
                        & extension)
            Loop
            f.Move dest
        End If
    Next

    For Each sf In fldr.SubFolders
        MoveFiles sf
    Next
End Sub

2 个答案:

答案 0 :(得分:2)

此处的问题是您要将所有源文件(包括子文件夹中的文件)复制到1个目标文件夹中。此时,文件有可能具有相同的文件名,并且您可能在复制过程中覆盖文件,或者文件将被跳过,因为它会将其视为副本。

您正尝试使用以下代码

来实现此目的
        count = 0
        Do While fso.FileExists(dest)
            count = count + 1
            dest  = fso.BuildPath(testfolder, basename & "_" & count & "." & extension)
        Loop

问题是,你不知道哪个文件对应哪个源文件。

我建议你将文件重命名为完整路径。因此,我们假设您的源文件夹如下所示:

enter image description here

在FolderExample和sub01中都有一个名为image01.jpg的文件。

我在这里使用下划线来分隔每个文件夹(这对你来说可能是现实的,也可能是不现实的)。但是通过创建这个新文件名,这意味着你不能用同一个名字覆盖任何其他文件!

enter image description here

现在,如果您需要再次使用该文件,问题是文件名已更改。在这里使用下划线的好处是你可以编写另一个应用程序来复制文件,用下划线分割,然后创建完整路径,获取文件名并相应地复制文件。

这意味着,您可以替换

    If LCase(extension) = "env" Then
        dest  = fso.BuildPath(testfolder, f.Name)
        count = 0
        Do While fso.FileExists(dest)
            count = count + 1
            dest  = fso.BuildPath(testfolder, basename & "_" & count & "." _
                    & extension)
        Loop
        f.Move dest
    End If

    If LCase(extension) = "env" Then
        dest  = fso.BuildPath(testfolder, f.Name)
        if not (fso.FileExists(dest)) then
            f.Move dest
        end if
    End If

答案 1 :(得分:1)

如果要在不创建重复项的情况下同步文件夹而不复制目标中已存在的文件,只需使用robocopy

robocopy "D:\Movie Keys\License\2013_Apr_19" "D:\env" *.env

或在脚本中:

@echo off

set dst=D:\env
set src=D:\Movie Keys\License\2013_Apr_19

robocopy "%src%" "%dst%" *.env

编辑:由于您希望将源树格式化为目标文件夹,因此robocopy将不适用于您的情况。您现有的代码接近您想要的,但由于您不想覆盖现有文件而又不想创建“版本化”副本,您需要更改此代码:

count = 0
Do While fso.FileExists(dest)
    count = count + 1
    dest  = fso.BuildPath(testfolder, basename & "_" & count & "." _
            & extension)
Loop
f.Move dest

进入这个:

If Not fso.FileExists(dest) Then f.Move dest

要根据扩展名使用各种目标文件夹,您可以使用dictonary来存储目标路径:

Set testfolder = CreateObject("Scripting.Dictionary")
testfolder.CompareMode = vbTextCompare  'case-insensitive
testfolder.Add "env", "D:\env"
testfolder.Add "key", "D:\key"

并改变你的代码:

If testfolder.Exists(extension) Then
  dest  = fso.BuildPath(testfolder(extension), f.Name)
  If Not fso.FileExists(dest) Then f.Move dest
End If