3

Пытается использовать VBScript для этого. У меня есть папка с несколькими файлами, которые включают имя сервера с расширением .vib. Все файлы отображаются какПоиск папки для файлов, содержащих имя и расширение сервера, затем выберите последний измененный файл и дату захвата в имени файла

servername.vm-<randomnumber><date>T<time>.vib 

, например:

SERVERNAME.vm-255622016-08-31T040037.vib 

Что мне нужно сделать, это захватить все файлы, которые содержат имясервера * .vib, а затем найти последний измененный файл в этом списке, затем вытащите дату из этого файла. Дата находится в формате xxxx-xx-xx и всегда отправляет T в имя файла и, похоже, находится в том же относительном месте.

До сих пор мне удалось приблизиться, используя this other question.

Однако у меня возникают проблемы с двумя вещами: поиск файлов, содержащих только имя сервера и получающих дату из самого файла.

Вот мой код до сих пор:

Set fso = CreateObject("Scripting.FileSystemObject") 

Set list = CreateObject("ADOR.Recordset") 
list.Fields.Append "name", 200, 255 
list.Fields.Append "date", 7 
list.Open 

For Each f In fso.GetFolder("J:\Files").Files 
    If (fso.GetExtensionName(f) = "vib") And (fso.Contains(ServerName)) Then 
    list.AddNew 
    list("name").Value = f.Path 
    list("date").Value = f.DateLastModified 
    list.Update 
    End If 
Next 

list.Sort = "date DESC" 
list.MoveFirst 
WScript.Echo list("name").Value 
list.Close 

Если удалить fso.Contains(ServerName) из If заявления затем прогонов кода, и я получаю последний файл VIB. Я просто не могу понять, как тестировать имя сервера, содержащееся в файле, поэтому я получаю файлы, в которых есть имя сервера.

Я также зациклился на том, как вытащить дату из самого файла и не могу начать выяснять, с чего начать.

ответ

1

FileSystemObject объекты не имеют метода Contains. Вы можете проверить имя файла для имени сервера, как это:

LCase(Left(f.Name, Len(ServerName))) = LCase(ServerName) 

Однако, так как вы хотите, чтобы извлечь дату, регулярное выражение может быть лучшим подходом:

Set re = New RegExp 
re.Pattern = ServerName + "\.vm-\d+?(\d{4}-\d{2}-\d{2})T\d{6}\.vib" 

С, что вы можете проверить наличие имени сервера, как это:

re.Test(f.Name) 

и извлечь дату, как это:

For Each m In re.Execute(f.Name) 
    datestring = m.SubMatches(0) 
Next 
+0

Удивительно, поэтому я получил его для работы с информацией, предоставленной для тестирования имени файла, я не понимал, что не могу делать с противником FSO. Но у меня возникли проблемы с извлечением даты с тем, что вы предоставили. К концу исходного сценария я получаю нужный мне файл и просто повторяю его. Мне нужна только дата для этого одного файла, но я не могу понять, как использовать регулярное выражение, чтобы просто получить дату из первого элемента списка. –

+0

Похоже, я смог его получить. Я использовал WScript.Echo re.Execute (список («имя»). Значение) .Item (0) .Submatches (0) –

1

Вот окончательный сценарий на тот случай, если кто-то захочет этого, но я отметил ответ Ансгара как ответ.

Set fso = CreateObject("Scripting.FileSystemObject") 

Set list = CreateObject("ADOR.Recordset") 
list.Fields.Append "name", 200, 255 
list.Fields.Append "date", 7 
list.Open 

DIM strServerName 
strServerName = "Put_Server_Name_Here" 

Set objRe = New RegExp 
objRe.IgnoreCase = True 
objRe.Pattern = strServerName + "\.vm-\d+?(\d{4}-\d{2}-\d{2})T\d{6}\.vib" 

For Each f In fso.GetFolder("J:\Files").Files 
    If (fso.GetExtensionName(f) = "vib") AND (objRe.Test(f.Name)) Then 
    list.AddNew 
    list("name").Value = f.Path 
    list("date").Value = f.DateLastModified 
    list.Update 
    End If 
Next 

list.Sort = "date DESC" 

list.MoveFirst 
WScript.Echo list("name").Value 
WScript.Echo objRE.Execute(list("name").Value).Item(0).Submatches(0) 

list.Close