2012-04-21 11 views
1

私はvbscript内の再帰に関する専門家の洞察力を求めています。 オンラインで見つかったさまざまな例から、私は次のコードを作成しました。vbscript recursion programming-techniques

私の質問です:それは(以前の結果を格納するためのパラメータを使用して)再帰関数を作成することになると、これは良いaproachですか?

これは、(自己完結型の)「関数」に入れるのが好ましいので、プロシージャはサブサブフォルダを結果として返します。しかし、ほとんどの例では「サブ」を使用していますが、「サブ」と「関数」についてはいつも混乱しています(関数を使用するものを返す必要のあるプロシージャが必要なときは、この例ではケース) しかし、私はまた、 "サブ"と単なる単純な参照を出力パラメータ(ByRef pSubfoldersList)を使用することができます

だからベストプラクティスは何ですか? (この関数はこの例でも、[shell.exec "cmd/c dir RootFolder/s/b/a:d"]と比べて非常に遅いですが、これは再帰による副作用か、本当に遅いですか?)

答えて

0

再帰的な関数で結果を渡すのが良いかどうか、私は実際にはわかりません。このようにして、他の方法と時間とメモリを比較することでテストできます。あなたのバージョンでこれを試してみませんでしたので、私は "Microsoft VBScriptランタイムエラー:許可が拒否されました"というエラーメッセージが表示されます。C:

あなたのソリューションの本当の問題は、あなたのケースでは、毎回BIG変数が作成されます。結果を配列に、またはVBscriptの場合は辞書に格納する方がよいでしょう。私は例を投稿します。

サブと機能の関係の違い:主な違い、結果の返却については正しいですが、それはオプションですので、私は常に関数を使用します。唯一の欠点は、値を割り当てないと変数と2つ以上のパラメータを使用する場合は、 "呼び出し"を使用する必要があります。 ByRefでアプローチを使用すると、メイングローバルコンテキストでvarを定義することもできます。カプセル化されていなくても読みやすく、結果を簡単に再利用またはデバッグできます。

vbscriptはファイル処理が非常に遅いですが、WMIを使用した場合、多少速度を上げる可能性がありますが、実際には一部の操作では、シェルを外してOSに処理させる方が良い。私は今Rubyでプログラムを作成しています。このようなほとんどのジョブはコードの1行で書くことができ、はるかに高速です。

あなたのファイルのリストを唯一の目的としている場合は、ツール「すべてを検索」を知って、1秒未満で数百万のファイルを検索できます見てみな !ここで

辞書

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

を使用した例である(メール:-(を動作していないよう通知)お返事ありがとう、それらは間違いなくいくつかの有用なヒントがあります。私は確かに "すべてを検索"をチェックアウトします 私は単にフォルダ内のファイルのリストを作成したいと思います。しかし今、私は再帰関数を作成する方法に興味を持っています あなたはRubyでどうやってやるのか教えていただけますか?私がvbscriptで持っている特定の問題は、関数内でpublic変数を定義することはできないと思われるので、(自己完結型)再帰関数の以前の結果を格納するオプションは残っていますか? – user1348255

+0

まあ、それはあなたがあなたの関数でアクセスできるグローバル変数としてiCountを使用する上記の私の答えで、あなたが "自己完結型"を定義する方法に依存し、そうでなければ、別の関数に変数を渡す必要がありますあなたがしたように参照によって)。私が知っているすべての言語にも同じことが当てはまります。私はRubyもスクリプト言語であるが、コンパイルされた言語のすべての能力を持ちながら、簡単に使用して学ぶことができるため、Rubyに助言します。 – peter