如何获取提供的VBScript来复制文件夹的文件?

时间:2013-04-09 21:34:07

标签: vbscript

我想找到最新的文件夹,并使用vbsscript将文件复制到目标文件夹。

这已完成here on SO,但所提供的解决方案对我不起作用。

Ansgar Wiechers提供了此代码。

rootFolder = "C:\root"
dstFolder  = "C:\dst"

Set fso = CreateObject("Scripting.FileSystemObject")

Set mostRecent = FindMostRecent(fso.GetFolder(rootFolder))
For Each f In mostRecent
  f.Copy fso.BuildPath(dstFolder, f.Name)
Next

Function FindMostRecent(fldr)
  Set mrf = fldr
  For Each sf In fldr.SubFolders
    Set mrsf = FindMostRecent(sf)
    If mrsf.DateLastModified > mrf.DateLastModified Then Set mrf = mrsf
  Next
  Set FindMostRecent = mrf
End Function

将第一行更改为rootFolder = "D:\",第二行更改为 dstFolder = "C:\",我收到以下错误:

Script: C:\Users\xxx\Desktop\new 456 82.vbs
Line:   14
Char:   5
Error:  Object required: 'FindMostRecent(...)'
Code:   800A01A8
Source:     Microsoft VBScript runtime error

将root更改为D:\Files,将目标更改为C:\test会产生:

Script: C:\Users\Bradley\Desktop\new 456 8.vbs
Line:   7
Char:   1
Error:  Object doesn't support this property or method
Code:   800A01B6
Source:     Microsoft VBScript runtime error

我还没有在同一个帖子中找到copy命令:

cls set knownpath=C:\a for /f "delims=" %%a in ('dir /ad /od /b "%knownpath%"') do ( set name=%%a )         copy "%knownpath%\%name%" "C:\b"

我不知道脚本在哪里放置命令。我在Set FindMostRecent = mrf之后尝试了一个新行,但是我收到了另一个错误。在End函数之后尝试,并获得另一个错误。

我需要把它分解为我,好像我是一个五岁的孩子。

编辑:确定现在主代码正在运行我正在尝试插入复制命令。这是我到目前为止所尝试的,它给了我错误。

    rootFolder = "D:\test"
    dstFolder  = "D:\test2"

    Set fso = CreateObject("Scripting.FileSystemObject")

    Set mostRecent = FindMostRecent(fso.GetFolder(rootFolder))
    For Each f In mostRecent.Files
      f.Copy fso.BuildPath(dstFolder, f.Name)
    Next

    Function FindMostRecent(fldr)
      Set mrf = fldr
      For Each sf In fldr.SubFolders
        Set mrsf = FindMostRecent(sf)
        If mrsf.DateLastModified > mrf.DateLastModified Then Set mrf = mrsf
      Next
      Set FindMostRecent = mrf
    End Function
    cls set knownpath="D:\test" for /f "delims=" %%a in ('dir /ad /od /b "%knownpath%"') do ( set name=%%a ) copy "%knownpath%\%name%" "D:\test2" 

EDIT2:

rootFolder = "D:\Files"
dstFolder  = "D:\test"

Set fso = CreateObject("Scripting.FileSystemObject")

Set mostRecent = FindMostRecent(fso.GetFolder(rootFolder))
mostRecent.Copy dstFolder

Function FindMostRecent(fldr)
  Set mrf = fldr
  For Each sf In fldr.SubFolders
    Set mrsf = FindMostRecent(sf)
    If mrsf.DateLastModified > mrf.DateLastModified Then Set mrf = mrsf
  Next
  Set FindMostRecent = mrf
End Function

2 个答案:

答案 0 :(得分:1)

代码的作用:

FindMostRecent()是一个递归(即自引用)函数,它返回给定根文件夹下文件夹树中最近修改过的文件夹。

如果给定的文件夹不包含子文件夹,则当前文件夹是最新的文件夹,因此该功能通过设置mrf = fldr默认为当前文件夹。

如果文件夹包含子文件夹,则每个子文件夹树中的最新文件夹由递归调用(FindMostRecent(sf))确定。将该文件夹(mrsf)中的“上次修改”日期与当前最新文件夹(mrf)的“上次修改”日期进行比较。如果mrsfmrf更新,则后者将替换为前者。

当检查每个现有子文件夹(如果有)时,mrf包含fldr下文件夹树中最新的文件夹,然后返回给调用者。


对于错误,请尝试在函数中添加一些调试代码:

Function FindMostRecent(fldr)
  Set mrf = fldr
  WScript.Echo "TypeName(mrf) = " & TypeName(mrf)
  WScript.Echo "mrf = " & mrf.Name
  WScript.Echo mrf.Path
  For Each sf In fldr.SubFolders
    Set mrsf = FindMostRecent(sf)
    On Error Resume Next
    If mrsf.DateLastModified > mrf.DateLastModified Then Set mrf = mrsf
    If Err Then
      WScript.Echo "TypeName(mrsf) = " & TypeName(mrsf)
      WScript.Echo "mrsf = " & mrsf.Name
    End If
    On Error Goto 0
  Next
  Set FindMostRecent = mrf
End Function

这应该可以帮助您追踪错误发生的位置。

答案 1 :(得分:0)

以下内容会将最近修改过的文件夹从rootFolder树(可能是rootFolder本身!)复制到dstFolder

rootFolder = "D:\Files"
dstFolder  = "D:\test"

Set fso = CreateObject("Scripting.FileSystemObject")

Set mostRecent = FindMostRecent(fso.GetFolder(rootFolder))
mostRecent.Copy dstFolder

Function FindMostRecent(fldr)
  Set mrf = fldr
  For Each sf In fldr.SubFolders
    Set mrsf = FindMostRecent(sf)
    If mrsf.DateLastModified > mrf.DateLastModified Then Set mrf = mrsf
  Next
  Set FindMostRecent = mrf
End Function

请注意,对于dstFolder = "D:\test",说明mostRecent.Copy dstFolder会将mostRecent内容复制到目标文件夹:

Before:

  D:\
  +-Files\
  | +-foo.txt
  | `-bar\
  `-test\

After:

  D:\
  +-Files\
  | +-foo.txt
  | `-bar\
  `-test\
    +-foo.txt
    `-bar\

如果要复制整个mostRecent文件夹:

Before:

  D:\
  +-Files\
  | +-foo.txt
  | `-bar\
  `-test\

After:

  D:\
  +-Files\
  | +-foo.txt
  | `-bar\
  `-test\
    `-Files\
      +-foo.txt
      `-bar\

目的地必须有一个反斜杠:

mostRecent.Copy dstFolder & "\"