2012-04-21 63 views
1

我正在尋找一些有關vbscript內遞歸的專家見解。 從網上找到的各種示例中,我創建了以下代碼,該代碼正常工作。vbscript遞歸編程技巧

我的問題是:這是一個很好的形式給出,當它(使用存儲先前的結果參數)來創建一個遞歸函數?

我更喜歡把它放在一個(自包含的)「函數」中,所以程序返回subsubfolders作爲結果。但大多數實例發現使用「子」時,我總是感到困惑,當涉及到「子」與「功能」(我明白當你想要一個程序,需要返回一些你使用的功能,恕我直言這似乎是案例在這個例子中) 但我也可以使用一個「子」,只是簡單的參考輸出參數(ByRef pSubfoldersList)

那麼最好的做法是什麼或更好地使用一個完全不同的方法呢? (這個函數與[shell.exec「cmd/c dir RootFolder/s/b/a:d」]相比也很慢,我想這是遞歸的一個副作用,或者FSO只是真的很慢嗎?)

回答

0

將遞歸函數的結果傳遞給我是不錯的做法,我真的不知道,你可以用這種方法和其他方法來測試,並比較時間和內存。沒有嘗試過這與您的版本因爲我得到的錯誤「Microsoft VBScript運行時錯誤:權限被拒絕」,如果我從C的根開始:

您的解決方案的真正問題是串聯,這需要時間,因爲在你的情況下,每次都會創建BIG變量。最好是將結果存儲在數組中,或者存儲在字典中的VBscript中。我會舉一個例子。

子和函數之間的區別是什麼:你是對的主要區別,返回的結果,但這是可選的,所以我總是使用函數,唯一的缺點是,如果你不分配值一個變量,你使用超過2個參數你必須使用「呼叫」。當你在ByRef中使用你的方法時,你也可以在主全局上下文中定義這個var,它可能被封裝得更少,但更易讀,你可以更容易地重用或調試結果。

速度問題:vbscript文件處理速度非常慢,如果你使用WMI,也許你可以加速一點但不是太多,確實對於一些操作,最好是將shell放出並讓操作系統處理它。我現在用Ruby編程,大多數這樣的作業可以用一行代碼編寫,而且速度更快。

說到快速,如果你唯一的目的是要有你的文件列表,瞭解工具「搜索一切」,在不到一秒鐘的時間內,你可以搜索數以百萬計的文件,如果你不知道它一探究竟 !

這裏是使用字典

set fso = CreateObject("Scripting.FileSystemObject") 
set filelist = CreateObject("Scripting.Dictionary") 
iCount = 0 
ShowSubfolders fso.GetFolder("C:\Documents and Settings\peter") 
PrintFilelist(filelist) 
'--- --- 
Function ShowSubFolders(Folder) 
    For Each Subfolder in Folder.SubFolders 
    on error resume next 
    wscript.echo Subfolder.Path 'show some progress 
    Set fFolder = fso.GetFolder(Subfolder.Path) 
    if err.number <> 0 then wscript.echo err.description 
    For Each File in fFolder.Files 
     iCount = iCount+1 
     filelist.add iCount, File.Path 
    Next 
    ShowSubFolders Subfolder 
    Next 
End Function 
'--- ---' 
Function PrintFilelist(ByRef dic) 
    Dim index, allKeys, allItems, msg 
    allKeys = dic.Keys 
    ' allKeys is an array to all the keys 
    allItems = dic.Items 
    ' allItems is an array to all the items 
    wscript.echo "There are " & dic.Count & " number of files in the dictionary" 
    For index = 0 To dic.Count-1 
    ' Notice, dictionary range goes from 0 to count-1 
    wscript.echo "Key=" & allKeys(index) & " Filename=" & allItems(index) 
    Next 
End Function 
+0

(郵件通知似乎並沒有工作:-()thanx您的回覆爲例,這些肯定是一些有用的提示。我一定會看看「搜索所有東西」 對於這個例子,我只是想創建一個文件夾內的文件列表和所有的子文件夾。但是現在我對如何創建一個遞歸函數很感興趣 也許你可以告訴我你將如何在Ruby中做到這一點?我對vbscript的具體問題是,在一個函數中定義一個公共變量似乎是不可能的,那麼剩下什麼選項來存儲(自包含的)遞歸函數的先前結果呢? – user1348255 2012-04-27 19:00:44

+0

好吧,這取決於你如何定義「自包含」,在我上面的回答中,我使用iCount作爲你可以在你的函數中訪問的全局變量,否則你必須將變量傳遞給另一個函數(或者在遞歸),就像你做的一樣。這同樣適用於我所知道的所有語言,我建議Ruby,因爲它也是一種腳本語言,但具有編譯語言的所有功能,但易於使用和學習。 – peter 2012-04-27 22:14:25