【问题标题】:Search folder for files that contain a server name and extension, then select the last modified file, and grab date in the filename在文件夹中搜索包含服务器名称和扩展名的文件,然后选择最后修改的文件,并在文件名中获取日期
【发布时间】:2017-02-14 11:44:40
【问题描述】:

尝试使用 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 文件。我只是不知道如何测试文件中包含的服务器名称,所以我只获取其中包含服务器名称的文件。

我还纠结于如何从文件本身中提取日期,不知道从哪里开始。

【问题讨论】:

    标签: loops vbscript string-parsing last-modified filesystemobject


    【解决方案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
    

    【讨论】:

    • 太棒了,所以我让它与为文件名测试提供的信息一起工作,我没有意识到我不能对 FSO 进行包含。但是我无法根据您提供的内容提取日期。在原始脚本结束时,我得到了我需要的文件并回显它。我只需要这个文件的日期,但我不知道如何使用正则表达式从第一个列表项中获取日期。
    • 看来我能得到它。我使用了 WScript.Echo re.Execute(list("name").Value).Item(0).Submatches(0)
    【解决方案2】:

    这是最终脚本以防万一有人需要,但我已将 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
    

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 2014-10-28
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多