1

私はVBScriptを初めて使用し、指定された名前付けパターンに一致する、指定されたフォルダー内の最新のサブフォルダーへのパスを返すコードを記述しようとしています。

基本的には、指定されたフォルダーを開いて、名前が「DevBuild」で始まるNEWESTサブフォルダーのパスを返すようにします。たとえば、特定のフォルダに3つのフォルダがある場合:

DevBuild-14.0  
DevBuild-15.0  
DebugBuild-15.0

「DevBuild」で始まる最新のフォルダであるため、「{指定されたフォルダへのパス} \DevBuild-15.0\」を返します。「最新」とは、作成日が最も新しいフォルダを意味します。より簡単な場合は、バージョン番号を意味します。どちらでも構いません。

これまでのところ私はこれを持っています:

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

4

2 に答える 2

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

すべての余分な変数(folder、folderNames、...)は、エラーが発生しやすい脂肪です。

.DateCreatedを使用して「最後の」サブフォルダーを取得するには、

  1. 表示された最新のフォルダーの.DateCreatedを追跡する日付(範囲外の小さな日付に初期化されます)
  2. これまでの最新フォルダを記録するIfステートメント

名前/プレフィックスに従ってフォルダをフィルタリングするには、次を追加します

  1. プレフィックスとその長さ
  2. 一致しないfolder(names)を回避するためのIfステートメント

コード内:

  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

フォルダ名のバージョンに依存するには、同じ戦略に従いますが、適切なデータ型(doubleバージョン、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

(!ドイツ語ロケール!)

于 2012-08-30T20:20:30.003 に答える
0

コードの一部は少し冗長です。これが私がこれを行う方法です。ForEachブロックに注目してください。

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
于 2012-08-30T19:26:45.920 に答える