1

vbscript内の再帰に関する専門家の洞察を探しています。オンラインで見つかったさまざまな例から、次のコードを作成しました。これは、ちなみに機能します。

私の質問は次のとおりです。再帰関数を作成する場合(以前の結果を格納するためのパラメーターを使用する場合)、これは良いアプローチですか?

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

では、ベストプラクティスは何ですか、それともまったく異なるアプローチをすべて一緒に使用する方がよいのでしょうか。(関数は、この例も[shell.exec "cmd / c dir RootFolder / s / b / a:d"]と比較して非常に遅いです。これは再帰の副作用であるか、FSOが実際にあるのではないかと思います。スロー?)

4

1 に答える 1

1

結果を再帰関数で渡すのが良い習慣かどうかはわかりませんが、この方法と他の方法を実行し、かかった時間とメモリを比較することで、これをテストできます。あなたのバージョンでこれを試していません。cのルートから開始すると、「Microsoft VBScriptランタイムエラー:アクセスが拒否されました」というエラーが表示されます。

ソリューションの本当の問題は連結です。この場合、BIG変数が毎回作成されるため、時間がかかります。結果を配列に格納するか、VBscriptの場合は辞書に格納することをお勧めします。例を投稿します。

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

速度に関するもの: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
于 2012-04-21T18:18:17.353 に答える