VBScript - 获取与模式匹配的最新子文件夹

时间:2012-08-30 18:43:18

标签: vbscript automation directory qtp

我是VBScript的新手,我正在尝试编写代码,该代码将返回给定文件夹中与给定命名模式匹配的最新子文件夹的路径。

基本上我希望它打开给定的文件夹并返回名称以“DevBuild”开头的NEWEST子文件夹的路径。例如,如果给定的文件夹有3个文件夹:

DevBuild-14.0  
DevBuild-15.0  
DebugBuild-15.0

我希望它返回“{Path to given folder} \ DevBuild-15.0 \”,因为它是以“DevBuild”开头的最新文件夹。 “最新”是指具有最新创建日期的文件夹,或者如果它比版本号更容易。无关紧要。

到目前为止,我有这个:

Dim fso, folder, subfolders
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("B:\")
Dim count
count = folder.SubFolders.Count - 1
Dim folderNames()
ReDim folderNames(count)
Set subfolders = folder.SubFolders

'MsgBox UBound(folderNames)

For i = 0 to count
    MsgBox subfolders(i).Name
Next

不幸的是我在第MsgBox subfolders(i).Name行收到错误,我认为这是因为我不明白如何从subfolders数组中获取元素。

2 个答案:

答案 0 :(得分:1)

解决从集合(数组,文件夹,...)中获取极值(最大,最近使用的......)问题的出发点应该是成语/模式:

  Dim sDir : sDir = "..\data\12203427"
  Dim oSDir
  For Each oSDir In goFS.GetFolder(sDir).SubFolders
      WScript.Echo "Saw:", oSDir.DateCreated, oSDir.Name
  Next

输出:

Saw: 30.08.2012 21:42:59 devbuild-15.10
Saw: 30.08.2012 21:43:24 DEVBUILD-15.09
Saw: 30.08.2012 21:44:21 devbuild-9.123
Saw: 30.08.2012 21:31:29 DebugBuild-15.0
Saw: 30.08.2012 21:24:00 DevBuild-14.0

所有额外变量(文件夹,folderNames,...)都容易出错。

要使用.DateCreated获取'last'子文件夹,只需编织

即可
  1. 跟踪所见最新文件夹的.DateCreated的日期(初始化为可能范围很小的日期)
  2. 到目前为止记录最新文件夹的If语句
  3. 要根据名称/前缀过滤文件夹,请添加

    1. 前缀及其长度
    2. 一个If语句,以避免不匹配的文件夹(名称)
    3. 在代码中:

        Dim sDir     : sDir      = "..\data\12203427"
        Dim dtMR     : dtMR      = #1/1/1970#
        Dim sMRDir   : sMRDir    = ""
        Dim sPfx     : sPfx      = "devbuild-"
        Dim nPfx     : nPfx      = Len(sPfx)
        Dim oSDir
        For Each oSDir In goFS.GetFolder(sDir).SubFolders
            WScript.Echo "Saw:", oSDir.Name
            If 0 = StrComp(sPfx, Left(oSDir.Name, nPfx), vbTextCompare) Then
               WScript.Echo Space(4), "DC:", oSDir.DateCreated
               If dtMR < oSDir.DateCreated Then
                  dtMR   = oSDir.DateCreated
                  sMRDir = oSDir.Name
               Else
                  WScript.Echo Space(4), "older then", dtMR
               End If
            Else
               WScript.Echo Space(4), "does not start with", sPfx
            End If
        Next
        WScript.Echo "-----------"
        If "" = sMRDir Then
           WScript.Echo "no subfolder found"
        Else
           WScript.Echo "found", sMRDir, dtMR
        End If
      

      输出:

      Saw: devbuild-15.10
           DC: 30.08.2012 21:42:59
      Saw: DEVBUILD-15.09
           DC: 30.08.2012 21:43:24
      Saw: devbuild-9.123
           DC: 30.08.2012 21:44:21
      Saw: DebugBuild-15.0
           does not start with devbuild-
      Saw: DevBuild-14.0
           DC: 30.08.2012 21:24:00
           older then 30.08.2012 21:44:21
      -----------
      found devbuild-9.123 30.08.2012 21:44:21
      

      要依赖文件夹名称的版本,请遵循相同的策略,但使用适当的 数据类型(双版本,RegExp过滤器和提取器):

        Dim sDir     : sDir      = "..\data\12203427"
        Dim dblMR    : dblMR     = -1.0
        Dim sMRDir   : sMRDir    = ""
        Dim reCut    : Set reCut = New RegExp
        reCut.IgnoreCase = True
        reCut.Pattern    = "^DevBuild-(\d+\.\d+)$"
        Dim oSDir
        For Each oSDir In goFS.GetFolder(sDir).SubFolders
            WScript.Echo "Saw:", oSDir.Name
            Dim oMTS : Set oMTS = reCut.Execute(oSDir.Name)
            If 1 = oMTS.Count Then
               Dim dblCVers : dblCVers = CDbl(oMTS(0).SubMatches(0))
               WScript.Echo Space(4), "Version:", dblCVers
               If dblMR  < dblCVers Then
                  dblMR  = dblCVers
                  sMRDir = oSDir.Name
               Else
                  WScript.Echo Space(4), "older then", dblMR
               End If
            Else
               WScript.Echo Space(4), "does not match", reCut.Pattern
            End If
        Next
        WScript.Echo "-----------"
        If "" = sMRDir Then
           WScript.Echo "no subfolder found"
        Else
           WScript.Echo "found", sMRDir, dblMR
        End If
      

      输出:

      Saw: devbuild-15.10
           Version: 15,1
      Saw: DEVBUILD-15.09
           Version: 15,09
           older then 15,1
      Saw: devbuild-9.123
           Version: 9,123
           older then 15,1
      Saw: DebugBuild-15.0
           does not match ^DevBuild-(\d+\.\d+)$
      Saw: DevBuild-14.0
           Version: 14
           older then 15,1
      -----------
      found devbuild-15.10 15,1
      

      (!德语区域设置!)

答案 1 :(得分:0)

你的一些代码有点多余。这是我如何做到这一点。注意For Each块。

Dim fso, folder, subfolders, subfolder
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("B:\")

Set subfolders = folder.SubFolders

Dim folderNames(subfolders.Count)

dim i
i = 0
For Each subfolder in subfolders
    folderNames(i) = subfolder.Name
    i = i + 1
Next