2012-04-21 2 views
1

Я ищу некоторую экспертную информацию относительно рекурсии внутри vbscript. Из различных примеров, найденных в Интернете, я создал следующий код, который работает, кстати.vbscript методы программирования рекурсии

Мой вопрос: Является ли это хорошо, когда речь Подход идет о создании рекурсивной функции (с использованием параметра для хранения предыдущих результатов)?

Я предпочитаю помещать это в (автономную) функцию, поэтому процедура возвращает подпункты в качестве результата. Но большинство найденных примеров используют «sub». Я всегда смущаюсь, когда речь заходит о «sub» vs «function» (я понимаю, когда вам нужна процедура, которая должна вернуть что-то, что вы используете функцию, imho это похоже на case в этом примере) Но я мог бы также использовать «под» и просто ссылку на выходной параметр (ByRef pSubfoldersList)

Итак, что такое лучшая практика или лучше использовать весь другой подход? (функция этих примеров также очень медленная по сравнению с [shell.exec "cmd/c dir RootFolder/s/b/a: d"], я думаю, это побочный эффект от рекурсии или, может быть, FSO просто на самом деле медленный?)

ответ

0

ли это хорошая практика, чтобы передать результат в рекурсивной функции, я действительно не знаю, вы можете проверить это, сделав это так, а другой и сравнив время и память. Не пробовал это с вашей версией, потому что я получаю сообщение об ошибке «Ошибка выполнения Microsoft VBScript: Permission denied», если я начинаю с корня c:

Реальная проблема с вашим решением - это конкатенация, которая требует времени, потому что в вашем случае переменная BIG создается каждый раз. Лучше было хранить результат в массиве или в случае VBscript в словаре. Я отправлю пример.

В чем разница между подфункцией и функцией: вы правы в отношении основного различия, возвращения результата, но это необязательно, поэтому я всегда использую функции, единственным недостатком является то, что если вы не назначаете значение переменная, и вы используете более двух параметров, которые вы должны использовать «вызов». Когда вы используете свой подход с ByRef, вы также можете определить var в основном глобальном контексте, возможно, менее инкапсулированный, но более читаемый, и вы можете более легко повторно использовать или отлаживать результаты.

Что касается скорости: vbscript ОЧЕНЬ медленен в обработке файлов, если вы использовали WMI, возможно, вы можете немного ускорить работу, но не очень, действительно, для некоторых операций лучше выложить оболочку и позволить ОС позаботиться об этом , Теперь я программирую в 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

+0

хорошо, это зависит от того, как вы определяете «самостоятельно», в моем ответе выше я использую iCount как глобальный var, доступ к которому вы можете получить в своих функциях, иначе вам нужно передать переменную в другую функцию (или же в случае рекурсия) по ссылке, как вы. То же самое касается всех языков, о которых я знаю, я советую Ruby, потому что это также язык сценариев, но со всей властью скомпилированных языков и, тем не менее, легко использовать и учиться. – peter