0

次のサブルーチンを作成しました。

Sub Openf(fldr,fso,ByRef newf)
  Dim subf,fpath,ext,fname,IsDone
  Set subf=fldr.SubFolders
  If(Not subf Is Nothing) Then
    For Each sf in subf
      fpath=fso.GetAbsolutePathName(sf.Path)
      fname=fso.GetBaseName(fpath)
      If(StrComp(fname,"mm")=0) Then
        IsDone=Delfldr(sf.SubFolders,fso,newf)
      End If
      Openf sf,fso,newf
    Next
  Else
    Set subf=fldr.Files
    For Each sf in subf
      fpath=fso.GetAbsolutePathName(sf.Path)
      ext=CStr(fso.GetExtensionName(fpath))
      If(StrComp(ext,"tar.gz")=0) Then
        Delfile subf,fso,newf
      End If
    Next
  End If
End Sub

特定のフォルダー内のすべてのサブフォルダーを再帰的に反復し、サブフォルダーが見つからなくなると停止することになっています。そのレベルでは、存在するファイルのコレクション (拡張子はtar.gz) を取得し、Delfileサブルーチンを呼び出す必要があります。もう 1 つの条件は、フォルダー内のサブフォルダーをmm(関数を使用して) 直接削除する必要がDelfldrあることです。ただし、ファイルが見つかるレベルには移動しません。

問題は、フォルダー内のmmフォルダーのみが削除されることです。スクリプトは、フォルダーと同じレベルにある他のサブフォルダーを通過していないようですmm。つまり、tar.gz拡張子を持つファイルは削除されません。

階層は次のとおりです。

C:\backups → c6,mm → es → at01 → files with tar.gz extension

また、return()VBScript のステートメントに相当するものはありますか? Delfldr最初は、サブルーチンが実行された後に制御が呼び出し元のステートメントに戻されなかったために問題が発生したと考えていました。そこで私はそれを関数に変更し、bool 値を に戻し、サブルーチンIsDoneに制御を戻すと考えました。Openfしかし、これはうまくいきませんでした。

4

1 に答える 1

1

あなたの手順には2つの問題があります:

  1. SubFoldersは常にFoldersコレクションであるため、コレクションにsfなることはなくNothing、コードがElseブランチに入ることはありません (したがって、ファイルを処理することはありません)。からあなたの状態を変更します

    Not subf Is Nothing
    

    fldr.SubFolders.Count > 0
    
  2. GetExtenstionName()単一の拡張子のみを返すため、 ではなくGetExtensionName("file.tar.gz")が生成されるため、コードがブランチに入ったとしても (そうではありません)、ファイルは削除されません。ファイル名から二重拡張子を抽出するには、次のようなものが必要です。gztar.gzElse

    ext = fso.GetExtensionName(fso.GetBaseName(fname)) & "." _
            & fso.GetExtensionName(fname)
    

    ところで、すでに文字列を返しているCStr()ので、ここでは必要ありません。GetExtensionName()

に関するあなたの質問についてはreturn()、どの点で「同等」を意味しますか? プロシージャ/関数を呼び出し元に返したい場合は、それぞれExit Subおよびを介して行うことができますExit Function。呼び出し元に値を返したい場合は、関数名に値を割り当てることでそれを行うことができます。

Function Foo()
  Foo = "bar"
End Function

後者はプロシージャではなく関数に対してのみ機能することに注意してください。また、代入は関数本体のどこでも行うことができ、最後である必要はありません。

より一般的な注意StrComp()として、3 段階の比較 (少ない/等しい/大きい) を実際に使用したい場合を除き、文字列の比較には使用しません。より良い(「より読みやすい」など)は、次のような単純な比較になります。

If LCase(ext) = "tar.gz" Then
于 2013-06-26T10:00:29.013 に答える