1

Тема: VBScript: поиск файла

Поиск файла (в приведённом примере поиск ведётся только на томах локальных несъёмных дисков, однако это легко может быть модифицировано).

Option Explicit


Dim objFSO
Dim objDrive
Dim strFileNameForFind
Dim i
ReDim arrPaths(0)                                                    ' Динамический массив для найденных путей


strFileNameForFind = "test.txt"                                      ' Имя файла для поиска.

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

arrPaths(LBound(arrPaths)) = False                                   ' Первый элемент массива - флаг результата поиска.

For Each objDrive In objFSO.Drives                                   ' Перебираем все существующие тома.
    If objDrive.DriveType = 2 Then                                   ' Том фиксированный?
        If objDrive.IsReady Then                                     ' Том готов?
            WScript.Echo "Find on drive " & objDrive.DriveLetter & ":..."
            
            FindInSubFolders objDrive.RootFolder, strFileNameForFind ' Вызываем процедуру поиска
                                                                     ' для корневой папки этого тома.
                                                                     ' Обработка вложенных папок будет
                                                                     ' вестись рекурсивно.
        End If
    End If
Next

If arrPaths(LBound(arrPaths)) Then                                   ' Файл(ы) был(и) найден(ы)?
    WScript.Echo
    WScript.Echo "Found paths for file [" & strFileNameForFind & "]:"
    WScript.Echo "------------------------------------------------------------"
    
    For i = LBound(arrPaths) + 1 To UBound(arrPaths)                 ' Выводим все найденные пути.
        WScript.Echo arrPaths(i)
    Next
    
    WScript.Echo "------------------------------------------------------------"
Else
    WScript.Echo "Not found paths for file [" & strFileNameForFind & "]."
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub FindInSubFolders(objFolder, strFileName)
    Dim objSubFolder
    Dim strFullFileName
    
    WScript.Echo objFolder.Path                                      ' Выводим путь обрабатываемой папки (для
                                                                     ' отладки; имеет смысл закомментировать).
    
    strFullFileName = objFSO.BuildPath(objFolder, strFileName)       ' Строим полный путь файла.
    
    If objFSO.FileExists(strFullFileName) Then                       ' Файл существует?
        ReDim Preserve arrPaths(Ubound(arrPaths) + 1)                ' Увеличиваем размер массива.
        arrPaths(LBound(arrPaths)) = True                            ' Устанавливаем флаг результата поиска.
        arrPaths(UBound(arrPaths)) = strFullFileName                 ' Запоминаем путь.
        
        WScript.Echo "Found file [" & strFileName & "] in folder [" & objFolder.Path & "]."
    End If
        
    On Error Resume Next                                             ' Обрабатываем ошибки, возможные в случае,
                                                                     ' когда нет доступа к содержимому папки
                                                                     ' (пример - «System Volume Information».
    For Each objSubFolder In objFolder.SubFolders
        If Err.Number = 0 Then                                       ' Удалось получить доступ к содержимому папки?
            On Error Goto 0                                          ' Восстанавливаем стандартную обработку ошибок
            FindInSubFolders objSubFolder, strFileName               ' Вызываем процедуру поиска для каждой из подпапок.
        Else                                                         ' Если не удалось —
            Err.Clear                                                ' сбрасываем состояние ошибки,
            On Error Goto 0                                          ' восстанавливаем стандартную обработку ошибок и движемся дальше.
            WScript.Echo "Can't enumerate subfolders for folder [" & objFolder.Path & "]."
        End If
    Next
End Sub
'=============================================================================

Идея использования метода .FileExists() вместо перебора коллекции .Files была почерпнута в процессе обсуждения на форуме, непосредственно из поста коллеги Xameleon.