1

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

这是在 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

更改根到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" 

编辑2:

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
4

2 回答 2

1

代码的作用:

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

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

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

检查每个现有子文件夹后(如果有),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

这应该可以帮助您追踪错误发生的时间点。

于 2013-04-09T22:04:29.883 回答
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 & "\"
于 2013-04-11T08:26:28.163 回答