2013-01-18 114 views
0

我是vbscripting的新手,我剛剛收到一個任務,要求我在文件名中找到6個匹配字符串的文件,以便我可以將這些文件移動到不同的目錄。我使用正則表達式模式「\ d {8} - \ d {6}」來查找文件名中的所有字符串。vbscript,找到匹配的文件名

我該如何去做一個目錄搜索並檢查是否有6個文件的文件名中有匹配的字符串,以便我可以將它們存儲到一個數組中,然後將這些文件移動到另一個目錄中?

到目前爲止,我已經寫腳本:

Set objFS = CreateObject("Scripting.FileSystemObject") 

strShareDirectory = "in\" 
strDumpStorageDir = "out\" 

Set objFolder = objFS.GetFolder(strShareDirectory) 
Set colFiles = objFolder.Files 

Set re = New RegExp 
re.Global  = True 
re.IgnoreCase = False 
re.Pattern = "-\d{8}-\d{6}" 

Dim curFile, matchValue 
Dim i: i = 0 

For Each objFile in colFiles 
    bMatch = re.Test(objFile.Name) 
    curFile = objFile.Name 

    If bMatch Then 
     ReDim preserve matches(i) 
     Matches(i) = curFile 
     i = (i + 1) 

     For Each objFile1 in colFiles 
     If objFile1.Name <> objFile.Name Then 
      For each match in re.Execute(objFile1.Name) 
       matchValue = match.Value 
       Exit For 
      Next 
      If (Instr(curFile, matchValue) > 0) Then 
       matchCount = 1 
       For Each match1 in re.Execute(objFile1.Name) 
        curFile1 = objFile1.Name 
        matchValue1 = match1.Value 
        Exit For 
        'If Then 

       Next 
       'msgbox(curFile1) 
      End If 
    End If 
    Next 
    End If 
Next 

這裏是我的樣本目錄,我有看起來像工作。 enter image description here

+0

1.)我有點困惑_what_應該是6?你想檢查一個文件名內的模式是否匹配六次? – KekuSemau

+0

對不起,我想要發送的文件,如果有6個文件中的文件名相同的數字。 – dweebles

+0

是的,這使得它更清晰;-) – KekuSemau

回答

1

啊,現在我明白了。 因此:您需要與模式匹配的所有文件名如果至少有6個文件具有相同的匹配子字符串。好的。然後,是的,我明白你可以在嵌套for..next循環中勒死。如果發生這種情況,我會建議將一些代碼放入額外的函數中。
在這個解決方案中,我使用字典來做一些工作要容易得多(每個對'exists'的調用都是對所有元素(例如,每個賦值)的另一個嵌套迭代)。
這個例子會忽略一個文件名中的多個匹配。

option explicit 

dim objFS : dim strShareDirectory : dim strDumpStorageDir : dim objFolder : dim colFiles : dim re : dim objFile 

dim dictResults ' dictionary of [filename] -> [matching substring] 
dim dictResultsCount ' dictionary of [matching substring] -> [count] 
dim dictResultsFinal ' only the valid entries from dictResults 
dim keyItem 
dim strMatch 

set dictResultsFinal = CreateObject("Scripting.Dictionary") 
set dictResults = CreateObject("Scripting.Dictionary") 
set dictResultsCount = CreateObject("Scripting.Dictionary") 

Set objFS = CreateObject("Scripting.FileSystemObject") 

strShareDirectory = "in\" 
strDumpStorageDir = "out\" 

Set objFolder = objFS.GetFolder(strShareDirectory) 
Set colFiles = objFolder.Files 

Set re = New RegExp 
re.Global  = True 
re.IgnoreCase = False 
re.Pattern = "-\d{8}-\d{6}" 

Dim curFile, matchValue 
Dim i: i = 0 

For Each objFile in colFiles 
    ' test if the filename matches the pattern 
    if re.test(objFile.Name) then 
     ' for now, collect all matches without further checks 
     strMatch = re.execute(objFile.Name)(0) 
     dictResults(objFile.Name) = strMatch 
     ' and count 
     if not dictResultsCount.Exists(strMatch) then 
      dictResultsCount(strMatch) = 1 
     else 
      dictResultsCount(strMatch) = dictResultsCount(strMatch) +1 
     end if 
    end if 
next 

' for testing: output all filenames that match the pattern 
msgbox join(dictResults.keys(), vblf) 

' now copy only the valid entries into a new dictionary 
for each keyItem in dictResults.keys() 
    if dictResultsCount.Exists(dictResults(keyItem)) then 
     if dictResultsCount(dictResults(keyItem)) >= 6 then 
      dictResultsFinal(keyItem) = 1 
     end if 
    end if 
next 

' test output the final result 
msgbox join(dictResultsFinal.keys(), vblf) 

---我的第一個答案

嗯,我也許應該問你嘗試過什麼但是......這裏是你的榜樣^^。 這應該給你足夠的開始(我忽略了你提到的'6'的要求)。詢問你是否需要更多解釋。

Option explicit 
dim a 
a = findFiles("G:\", "\d{8}-\d{6}") 
msgbox join(a, vblf) 

function findFiles(path, pattern) 
    dim rx 
    dim fso 
    dim fsoFolder 
    dim fsoFiles 
    dim results 
    dim item 
    set rx = new regexp 
    rx.pattern = pattern 
    set results = CreateObject("Scripting.Dictionary") 
    set fso = CreateObject("Scripting.FileSystemObject") 
    set fsoFolder = fso.GetFolder(path) 
    set fsoFiles = fsoFolder.Files 
    for each item in fsoFiles 
     if rx.test(item.name) then results(item.name) = 1 
    next 
    set fso = nothing 
    set fsoFolder = nothing 
    set fsoFiles = nothing 
    findFiles = results.keys() 
end function 
3

正如@ KekuSemau的建議並不涉及分組文件的(子)問題,dweebles沒有給出完整的故事(爲什麼陣列?爲什麼在具有文件的完整(子)集的堅持? ),並且數字(文件名中的6,3/4部分組)與基本任務無關 - 根據文件名的某些部分將一組文件分發到文件夾中 - 我聲稱解決問題的方法任務是擺脫所有的數組,字典,和正則表達式的幻想,並保持它的簡單:

前:

tree /A /F ..\data 
+---in 
|  B-2 
|  B-1 
|  A-3 
|  A-2 
|  B-3 
|  A-1 
| 
\---out 

代碼:

Const csSrc = "..\data\in" 
    Const csDst = "..\data\out" 
    Dim f, n, d 
    For Each f In goFS.GetFolder(csSrc).Files 
     n = Split(f.Name, "-") 
     If 1 = UBound(n) Then 
     d = goFS.BuildPath(csDst, n(1)) 
     If Not goFS.FolderExists(d) Then goFS.CreateFolder d 
     f.Move goFS.BuildPath(d, f.Name) 
     End If 
    Next 

後:

tree /A /F ..\data 
+---in 
\---out 
    +---3 
    |  A-3 
    |  B-3 
    | 
    +---1 
    |  B-1 
    |  A-1 
    | 
    \---2 
      B-2 
      A-2 

附: 這個problem可以使用相同的方法解決。

+2

+1過度設計事物是所有邪惡的根源。 –

+0

^非常真實,我真的需要更簡單有效的方法來解決這個問題。謝謝! – dweebles

相關問題