1

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

因为我计划每 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
4

2 回答 2

2

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

您正在尝试使用以下代码实现此目的

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

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

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

在此处输入图像描述

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

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

在此处输入图像描述

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

这意味着,您可以更换

    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
于 2013-04-19T08:08:09.110 回答
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

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

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
于 2013-04-19T08:46:42.280 回答