在文件夹中搜索包含服务器名称和扩展名的文件,然后是 select 最后修改的文件,并在文件名中获取日期
Search folder for files that contain a server name and extension, then select the last modified file, and grab date in the filename
正在尝试使用 VBScript 执行此操作。我有一个包含多个文件的文件夹,其中包含扩展名为 .vib 的服务器名称。所有文件显示为
servername.vm-<randomnumber><date>T<time>.vib
例如:
SERVERNAME.vm-255622016-08-31T040037.vib
我需要做的是抓取所有包含 servername*.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
如果我从 If
语句中删除 fso.Contains(ServerName)
,那么代码就会运行,我会得到最新的 vib 文件。我只是不知道如何测试文件中包含的服务器名,所以我只得到其中包含服务器名的文件。
我也被困在如何从文件本身中提取日期,无法开始弄清楚从哪里开始。
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
这是最终脚本,以防有人需要,但我已将 Ansgar 的回复标记为答案。
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
正在尝试使用 VBScript 执行此操作。我有一个包含多个文件的文件夹,其中包含扩展名为 .vib 的服务器名称。所有文件显示为
servername.vm-<randomnumber><date>T<time>.vib
例如:
SERVERNAME.vm-255622016-08-31T040037.vib
我需要做的是抓取所有包含 servername*.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
如果我从 If
语句中删除 fso.Contains(ServerName)
,那么代码就会运行,我会得到最新的 vib 文件。我只是不知道如何测试文件中包含的服务器名,所以我只得到其中包含服务器名的文件。
我也被困在如何从文件本身中提取日期,无法开始弄清楚从哪里开始。
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
这是最终脚本,以防有人需要,但我已将 Ansgar 的回复标记为答案。
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