Тема: 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.