【问题标题】:Iterate through the folder and find a particular file遍历文件夹并找到特定文件
【发布时间】:2015-06-19 07:59:53
【问题描述】:

我编写了这段代码来遍历文件夹并在找到“.c”文件时退出函数。理想情况下,它应该返回“.c”文件的路径。但它返回的是空字符串。

tval = 1
Function findStlcode(objFSO,fFolder,folderName)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = objFSO.GetFolder(fFolder)
    Set colfiles = Folder.Files
    For Each objFile In colfiles
        strFilename = objFile.name
        If strcomp(strFilename,folderName & ".c",vbTextCompare) = 0 Then
            findStlcode = fFolder & "\" & folderName & ".c"
            tval = tval + 1
            Exit Function
        End If
    Next
    For Each Subfolder In Folder.SubFolders
        If tval = 1 Then
            xx = findStlcode(objFSO, Subfolder.Path, folderName)
        End If
    Next
End Function

【问题讨论】:

  • 我看不到您如何返回结果。什么类型的“findStlcode”?
  • @Zam 返回不正确,因为 OP 在递归中将其分配给 xx

标签: vbscript directory subdirectory


【解决方案1】:

将 FOR 循环内容更改为下面,将 xx 更改为 findStlcode,它应该可以工作

strFilename = objFile.name
If Right(strFilename, 2) = ".c" Then
    findStlcode = fFolder & "\" & strFilename
    tval = tval + 1
    Exit Function
End If

下面的完整代码

tval = 1
Function findStlcode(objFSO,fFolder)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = objFSO.GetFolder(fFolder)
    Set colfiles = Folder.Files
    For Each objFile In colfiles
        strFilename = objFile.name
        If Right(strFilename, 2) = ".c" Then
            findStlcode = fFolder & "\" & strFilename
            tval = tval + 1
            Exit Function
        End If
    Next
    For Each Subfolder In Folder.SubFolders
        If tval = 1 Then
            findStlcode = findStlcode(objFSO, Subfolder.Path)
        End If
    Next
End Function

调用函数

Set objFSO = CreateObject("Scripting.FileSystemObject")
Wscript.Echo findStlcode(objFSO, "C:\")

【讨论】:

    【解决方案2】:

    您的问题的根本原因是您的函数实际上并没有返回路径(通过将其分配给函数名称),正如其他人已经指出的那样。

    但是,您可能需要解决与您的实施有关的其他一些问题:

    • 不应使用全局变量来跟踪是否找到了匹配文件。递归函数调用的返回值可用于相同的效果。
    • 如果您要在每个函数调用中重新创建它,传递objFSO 是没有意义的。实际上,在所有情况下,最好将 FileSystemObject 实例创建为全局(单例)对象并在脚本中的任何位置使用它。
    • 传递文件夹对象而不是路径字符串,因此您不必在下一个递归步骤中将字符串转回文件夹对象。
    • 如果您要检查扩展名,请使用适当的方法从文件名 (GetExtensionName) 中提取扩展名。

    这样就足够了:

    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Function findStlcode(fldr)
      Dim f, sf, path
    
      For Each f In fldr.Files
        If LCase(fso.GetExtensionName(f)) = "c" Then
          path = f.Path
          Exit For
        End If
      Next
    
      For Each sf In fldr.SubFolders
        If IsEmpty(path) Then path = findStlcode(sf)
      Next
    
      findStlcode = path
    End Function
    
    startFolder = "C:\some\folder"
    cfile = findStlCode(fso.GetFolder(startFolder))
    

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多