Использование объекта файловой системы для создания журнала файлов с именем, которое соответствует строке

У меня есть каталог, содержащий множество файлов с одинаковым именем, вложенных в разные папки и подпапки. Я пытаюсь создать скрипт vbs, который будет искать в каталоге и находить любые файлы с именем «история» и записывать имя, путь и дату изменения в файлы.

Я успешно смог создать сценарий для возврата всех файлов в папке, но не смог сделать так, чтобы записывались только те, которые называются «История». Я пытался добавить оператор If в for, чтобы он выглядел так:

For Each ObjFolder In ObjSubFolders
    If ObjFolder.Name = "history*.*" Then
    ResultLogFile.WriteLine(ObjFolder.Name & vbab & ObjFolder.Path)
End If

Но это не сработало

Это то, что у меня есть до сих пор:

Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0

Dim fso
Dim OutputFileName
Dim ResultLogFile


vCurrentDate = Now
'Year string
vCurrentYear = CStr(DatePart("yyyy",vCurrentDate))

'Month string
If DatePart("m",vCurrentDate) < 10 Then
    vCurrentMonth = "0" & CStr(DatePart("m",vCurrentDate))
Else
    vCurrentMonth = CStr(DatePart("m",vCurrentDate))
End If

'Day string
If DatePart("d",vCurrentDate) < 10 Then
    vCurrentDay = "0" & CStr(DatePart("d",vCurrentDate))
Else
    vCurrentDay = CStr(DatePart("d",vCurrentDate))
End If  

Set fso = CreateObject("Scripting.FileSystemObject")

OutputFileName = "C:\historylogs\" & vCurrentYear & "-" & vCurrentMonth & "-" & vCurrentDay & ".tsv"

'MySourcePath = "C:\Test Folder\"
'Check if file already exists:

If fso.FileExists(OutputFileName) Then
    'File exists, so open it for appending and add no new header info:
    Set ResultLogFile = fso.OpenTextFile(OutputFileName, ForAppending, True, TristateTrue)
Else
    'File did not exist, so create it and add a header
    Set ResultLogFile = fso.OpenTextFile(OutputFileName, ForWriting, True, TristateTrue)
    'Create log headers
    ResultLogFile.WriteLine "FileName" & vbTab & "FilePath" & vbTab & "DateLastModified"
End If

GetFiles("C:\Test Folder")

Function GetFiles(FolderName)
    'On Error Resume Next

Dim ObjFolder
Dim ObjSubFolders
Dim ObjSubFolder
Dim ObjFiles
Dim ObjFile 

Set ObjFolder = fso.GetFolder(FolderName)
Set ObjFiles = ObjFolder.Files

'Write all files to output files
For Each ObjFile In ObjFiles
    ResultLogFile.WriteLine(ObjFile.Name & vbTab & ObjFile.Path & vbTab & ObjFile.DateLastModified)
Next
'Getting all subfolders
Set ObjSubFolders = ObjFolder.SubFolders

For Each ObjFolder In ObjSubFolders
    'Writing SubFolder Name and Path
    ResultLogFile.WriteLine(ObjFolder.Name & vbab & ObjFolder.Path)

    'Getting all Files from subfolder
    GetFiles(ObjFolder.Path)
Next

End Function

person user3284471    schedule 07.02.2014    source источник


Ответы (1)


Вы можете сделать это несколькими способами.. измените это, если..

For Each ObjFile In ObjFiles
  ResultLogFile.WriteLine(ObjFile.Name & vbTab & ObjFile.Path & vbTab & ObjFile.DateLastModified)
Next

..вы хотите найти любой файл с историей в имени, независимо от того, где:

For Each ObjFile In ObjFiles
  If InStr(1, ObjFile.Name, "history") Then
    ResultLogFile.WriteLine(ObjFile.Name & vbTab & ObjFile.Path & vbTab & ObjFile.DateLastModified)
  End If
Next

..вы хотите найти все файлы, которые начинаются с истории:

For Each ObjFile In ObjFiles
  If LCase(Mid(ObjFile.Name, 1, 7)) = "history" Then
    ResultLogFile.WriteLine(ObjFile.Name & vbTab & ObjFile.Path & vbTab & ObjFile.DateLastModified)
  End If
Next

РЕДАКТИРОВАТЬ: отвечая на ваш комментарий, вы можете иметь рекурсивную подпрограмму, подобную этой. Он будет искать во всех папках и подпапках любой файл, который начинается с того, что вы передаете ... поэтому, если вы пройдете «история», будет найдена история файлов *.

Set objFSO = CreateObject("Scripting.FileSystemObject")

Call findFiles(objFSO.GetFolder("C:\temp"), "history")

Sub findFiles(objFolder, strMatchString)

  For Each objSubFolder In objFolder.SubFolders
    Call findFiles (objSubFolder, strMatchString)
  Next

  Set objFiles = objFolder.Files

  For Each objFile In objFiles
    If LCase(Mid(objFile.Name, 1, Len(strMatchString))) = LCase(strMatchString) Then
      MsgBox objFile.Name & vbTab & objFile.Path & vbTab & objFile.DateLastModified
    End If
  Next 
End Sub
person QuickNull    schedule 07.02.2014
comment
Спасибо! это работает для получения файлов истории из основной папки, но есть и некоторые в подпапках. Я пробовал это, но это спасибо! это работает для извлечения файлов истории из основной папки, но есть и в подпапках - person user3284471; 07.02.2014
comment
Отредактировал свой пост в ответ на ваш комментарий. Вам нужно будет изменить MsgBox на объект ResultLogFile.WriteLine и удалить некоторый ненужный код, но это должно делать то, о чем вы просите. - person QuickNull; 07.02.2014