使用vbscript从一批相似的文件中复制最新的文件

使用vbscript从一批相似的文件中复制最新的文件,vbscript,Vbscript,我不确定这是否可能。我甚至不知道从哪里开始。我有几千个文件,其中文件名的命名如下: nnnnnnnnnnnnnnnn.yyyyddmm.pdf(n=编号,yyyy=年,dd=日,mm=月) 在这数千个文件中,有一批相似的文件具有相同的nnnnnnnnnnnnnnnnnnnn文件名部分,但.yyyydmm不同,以表示文件的日期。(这些批相似的文件将在稍后合并在一起,但这对本场景并不重要) 我的问题是,有没有办法比较类似文件的yyyydmm部分,并将最近的日期文件复制到不同的文件夹?我需要将文件名中

我不确定这是否可能。我甚至不知道从哪里开始。我有几千个文件,其中文件名的命名如下:

nnnnnnnnnnnnnnnn.yyyyddmm.pdf(n=编号,yyyy=年,dd=日,mm=月)

在这数千个文件中,有一批相似的文件具有相同的
nnnnnnnnnnnnnnnnnnnn
文件名部分,但
.yyyydmm
不同,以表示文件的日期。(这些批相似的文件将在稍后合并在一起,但这对本场景并不重要)

我的问题是,有没有办法比较类似文件的
yyyydmm
部分,并将最近的日期文件复制到不同的文件夹?我需要将文件名中相似文件的最新日期复制到其他文件夹

我之所以对此有问题,是因为我不确定是否可以比较文件名的各个部分,以确定哪一部分实际上是具有最新日期的文件。我知道有一种方法可以通过查看日期修改日期来完成,但这并不总是给我一个与最近日期相同的文件


有什么想法吗??如果我能提供更多信息,请告诉我。

试图了解您的问题/规格。假设在.pdf文件夹的文件上循环会导致:

Looking at "0000000000012345.20120402.pdf"
Looking at "0000000000012345.20120502.pdf"
Looking at "0000000000012348.20121702.pdf"
Looking at "0000000000012346.20120802.pdf"
Looking at "0000000000012347.20121002.pdf"
Looking at "0000000000012348.20121602.pdf"
Looking at "0000000000012347.20121302.pdf"
Looking at "0000000000012347.20121202.pdf"
Looking at "0000000000012345.20120202.pdf"
Looking at "0000000000012348.20121502.pdf"
Looking at "0000000000012346.20120602.pdf"
Looking at "0000000000012346.20120902.pdf"
Looking at "0000000000012348.20121402.pdf"
Looking at "0000000000012346.20120702.pdf"
Looking at "0000000000012347.20121102.pdf"
Looking at "0000000000012345.20120302.pdf"
Microsoft VBScript runtime error: Object doesn't support this property or method: 'dicG(...).Copy'

Last file for 0000000000012345 is 0000000000012345.20120502.pdf
Last file for 0000000000012348 is 0000000000012348.20121702.pdf
Last file for 0000000000012346 is 0000000000012346.20120902.pdf
Last file for 0000000000012347 is 0000000000012347.20121302.pdf
确定要正确复制的文件?如果是,请回答,我将在这里发布代码

首先,您需要一个类来获取并存储放入文件名中的信息:

' cut & store info about file(names) like "0000000000012347.20121202.pdf"
Class cCut
  Private m_sN  ' complete file name
  Private m_sG  ' group/number prefix part
  Private m_dtF ' date part; converted to ease comparisons
  Public Function cut(reCut, sFiNa)
    Set cut = Me ' return self/this from function
    Dim oMTS : Set oMTS = reCut.Execute(sFiNa)
    If 1 = oMTS.Count Then
       m_sN  = sFiNa
       Dim oSM : Set oSM = oMTS(0).SubMatches
       m_sG  = oSM(0)
       m_dtF = DateSerial(oSM(1), oSM(3), oSM(2))
    Else
       ' Err.Raise
    End If
  End Function ' cut
  Public Property Get G() : G = m_sG  : End Property ' G
  Public Property Get D() : D = m_dtF : End Property ' D
  Public Property Get N() : N = m_sN  : End Property ' N
End Class ' cCut
然后只需在.Files上循环并检查字典中存储的每个组的日期部分(数字前缀部分用作键):

并包含一些处理不同方面/策略的函数,以解决常见问题/主题。当我在这里发布代码时,我会复制/粘贴功能框架中间的工作/测试代码,如

' ============================================================================
goXPLLib.Add _
  "useDic02", "use a dictionary (Mark II)"
' ----------------------------------------------------------------------------
' ============================================================================
Function useDic02()
  useDic02 = 1 ' assume error

  ' The one and only .pdf folder - no recursion into subfolders!
  ...
  Next

  useDic02 = 0 ' success
End Function ' useDic02
(是的,有一个第一次尝试的函数“useDic()”,它在第二个循环中存储每个组要处理的所有OCUT;是的,有一个函数“createTestData()”,我需要设置/填充我的TDir)。有时候我很邋遢,忘记了GOF,请接受我的道歉

变量名是实验的一部分。我过去主张使用类型前缀的长变量名,包括

Dim nIdx
For nIdx = 0 To UBound(aNames)
    aNames(nIdx) = ...
Next
其他人认为nIdx alikes变量只是在mistype中添加了一些字母,但在i上没有额外的含义,没有上下文就无法理解aNames alikes,如果你有上下文,aN将是一个同样好的余数“将当前处理文件中波斯国王的名字与数据库中的名字进行比较”

所以我想:考虑到文件名有三个有趣的方面(要复制的全名、要组的数字前缀、要比较/决定的日期部分),并且在这三个方面之间有半个屏幕

  Private m_sN  ' complete file name

假设您只需要剪切对象的这3个属性就可以在中使用它

  Dim oCut : Set oCut = New cCut.cut(reCut, oFile.Name)
  If Not dicG.Exists(oCut.G) Then
     ' new group, first file, assume this is the latest
     Set dicG(oCut.G) = oCut
  Else
     ' found a better one for this group?
     If dicG(oCut.G).D < oCut.D Then Set dicG(oCut.G) = oCut
代替/补充该行

WScript.Echo "Last file for", sG, "is", dicG(sG).N

我没有预料到.CopyFipe会阻塞相对源路径,所以考虑用*P*AX属性替换CDCH类的*N*Am属性。

试图使用

dicG(sG).Copy "..\data\latest\", True
结果:

Looking at "0000000000012345.20120402.pdf"
Looking at "0000000000012345.20120502.pdf"
Looking at "0000000000012348.20121702.pdf"
Looking at "0000000000012346.20120802.pdf"
Looking at "0000000000012347.20121002.pdf"
Looking at "0000000000012348.20121602.pdf"
Looking at "0000000000012347.20121302.pdf"
Looking at "0000000000012347.20121202.pdf"
Looking at "0000000000012345.20120202.pdf"
Looking at "0000000000012348.20121502.pdf"
Looking at "0000000000012346.20120602.pdf"
Looking at "0000000000012346.20120902.pdf"
Looking at "0000000000012348.20121402.pdf"
Looking at "0000000000012346.20120702.pdf"
Looking at "0000000000012347.20121102.pdf"
Looking at "0000000000012345.20120302.pdf"
Microsoft VBScript runtime error: Object doesn't support this property or method: 'dicG(...).Copy'

因为存储的对象不是文件(具有.Copy方法),而是CCUT(不具有)。

试图了解您的问题/规格。假设在.pdf文件夹的文件上循环会导致:

Looking at "0000000000012345.20120402.pdf"
Looking at "0000000000012345.20120502.pdf"
Looking at "0000000000012348.20121702.pdf"
Looking at "0000000000012346.20120802.pdf"
Looking at "0000000000012347.20121002.pdf"
Looking at "0000000000012348.20121602.pdf"
Looking at "0000000000012347.20121302.pdf"
Looking at "0000000000012347.20121202.pdf"
Looking at "0000000000012345.20120202.pdf"
Looking at "0000000000012348.20121502.pdf"
Looking at "0000000000012346.20120602.pdf"
Looking at "0000000000012346.20120902.pdf"
Looking at "0000000000012348.20121402.pdf"
Looking at "0000000000012346.20120702.pdf"
Looking at "0000000000012347.20121102.pdf"
Looking at "0000000000012345.20120302.pdf"
Microsoft VBScript runtime error: Object doesn't support this property or method: 'dicG(...).Copy'

Last file for 0000000000012345 is 0000000000012345.20120502.pdf
Last file for 0000000000012348 is 0000000000012348.20121702.pdf
Last file for 0000000000012346 is 0000000000012346.20120902.pdf
Last file for 0000000000012347 is 0000000000012347.20121302.pdf
确定要正确复制的文件?如果是,请说明,我将在此处发布代码

首先,您需要一个类来获取并存储放入文件名中的信息:

' cut & store info about file(names) like "0000000000012347.20121202.pdf"
Class cCut
  Private m_sN  ' complete file name
  Private m_sG  ' group/number prefix part
  Private m_dtF ' date part; converted to ease comparisons
  Public Function cut(reCut, sFiNa)
    Set cut = Me ' return self/this from function
    Dim oMTS : Set oMTS = reCut.Execute(sFiNa)
    If 1 = oMTS.Count Then
       m_sN  = sFiNa
       Dim oSM : Set oSM = oMTS(0).SubMatches
       m_sG  = oSM(0)
       m_dtF = DateSerial(oSM(1), oSM(3), oSM(2))
    Else
       ' Err.Raise
    End If
  End Function ' cut
  Public Property Get G() : G = m_sG  : End Property ' G
  Public Property Get D() : D = m_dtF : End Property ' D
  Public Property Get N() : N = m_sN  : End Property ' N
End Class ' cCut
然后只需在.Files上循环并检查字典中存储的每个组的日期部分(数字前缀部分用作键):

并包含一些处理不同方面/策略的函数,以解决常见问题/主题。当我在此处发布代码时,我会从函数框架的中间复制/粘贴工作/测试代码,如

' ============================================================================
goXPLLib.Add _
  "useDic02", "use a dictionary (Mark II)"
' ----------------------------------------------------------------------------
' ============================================================================
Function useDic02()
  useDic02 = 1 ' assume error

  ' The one and only .pdf folder - no recursion into subfolders!
  ...
  Next

  useDic02 = 0 ' success
End Function ' useDic02
(是的,有一个第一次尝试的函数“useDic()”,它在第二个循环中存储了要处理的每个组的所有OCUT;是的,有一个函数“createTestData()”,我需要设置/填充我的TDir)。有时我很马虎,忘记了goFS,请接受我的道歉

变量名是一个实验的一部分。我过去主张使用类型前缀的长变量名,包括

Dim nIdx
For nIdx = 0 To UBound(aNames)
    aNames(nIdx) = ...
Next
其他人认为nIdx alikes变量只是在mistype中添加了一些字母,但在i上没有额外的含义,没有上下文就无法理解aNames alikes,如果你有上下文,aN将是一个同样好的余数。”将当前处理文件中波斯国王的名字与数据库中的名字进行比较”

所以我想:考虑到文件名有三个有趣的方面(要复制的全名、要组的数字前缀、要比较/决定的日期部分),并且在这三个方面之间有半个屏幕

  Private m_sN  ' complete file name

假设您只需要剪切对象的这3个属性就可以在中使用它

  Dim oCut : Set oCut = New cCut.cut(reCut, oFile.Name)
  If Not dicG.Exists(oCut.G) Then
     ' new group, first file, assume this is the latest
     Set dicG(oCut.G) = oCut
  Else
     ' found a better one for this group?
     If dicG(oCut.G).D < oCut.D Then Set dicG(oCut.G) = oCut
代替/补充该行

WScript.Echo "Last file for", sG, "is", dicG(sG).N

我没有预料到.CopyFipe会阻塞相对源路径,所以考虑用*P*AX属性替换CDCH类的*N*Am属性。

试图使用

dicG(sG).Copy "..\data\latest\", True
结果:

Looking at "0000000000012345.20120402.pdf"
Looking at "0000000000012345.20120502.pdf"
Looking at "0000000000012348.20121702.pdf"
Looking at "0000000000012346.20120802.pdf"
Looking at "0000000000012347.20121002.pdf"
Looking at "0000000000012348.20121602.pdf"
Looking at "0000000000012347.20121302.pdf"
Looking at "0000000000012347.20121202.pdf"
Looking at "0000000000012345.20120202.pdf"
Looking at "0000000000012348.20121502.pdf"
Looking at "0000000000012346.20120602.pdf"
Looking at "0000000000012346.20120902.pdf"
Looking at "0000000000012348.20121402.pdf"
Looking at "0000000000012346.20120702.pdf"
Looking at "0000000000012347.20121102.pdf"
Looking at "0000000000012345.20120302.pdf"
Microsoft VBScript runtime error: Object doesn't support this property or method: 'dicG(...).Copy'
因为存储的对象不是文件(有.Copy方法),而是CCUT(没有)。我将如何处理它:

  • 我会为每个唯一数字部分创建一个单独键的字典。该值将是一个数组,所有文件名共享该键(从而共享唯一数字部分)

  • 对于字典中的每个键,我将遍历数组中的项,搜索最近的日期

  • 方法:

  • 获取文件
  • 提取数字部分
  • 看看有没有