VBscript在一定的时间范围内检查文件是否存在(能够使用通配符)

大家早上好,我一直在试图把一个VB脚本放在一起,当脚本被读取时,VB脚本会从用户那里获取一个文件path和一个文件名(可能有一个通配符)。 然后,脚本会检查指定的目录,find与提供的文件名相匹配的文件,然后查看上次修改的date,以查看它是否在特定时间范围内(即上午6点加上或减去5分钟)被创build/修改。 然后它会将所述文件复制到一个zip文件中。

到目前为止,我已经能够得到参数的工作,并且我已经设置了抓取当前时间,查看文件夹中的文件,并将硬编码的文件名与文件夹中的文件名匹配。 这是我迄今为止。

currentTime = Now() filePath = Wscript.Arguments.Item(0) fileName = Wscript.Arguments.Item(1) Set fileSystem = CreateObject("Scripting.FileSystemObject") Set directory = fileSystem.GetFolder(filePath) For each file in directory.Files If file.Name = fileName Then Wscript.echo file.Name & " " & file.DateLastModified end if Next 

我是VB脚本noob,我期待着学习的方式!

CAP3

Solutions Collecting From Web of "VBscript在一定的时间范围内检查文件是否存在(能够使用通配符)"

如果您使用WMI,它支持通配符。

 Dim strPath strFile = "*.*" If WScript.Arguments.Count > 1 Then strPath = WScript.Arguments.Item(0) strFile = WScript.Arguments.Item(1) Elseif WScript.Arguments.Count = 1 Then strPath = WScript.Arguments.Item(0) Else End If Set objFso = CreateObject("Scripting.FileSystemObject") If Not objFso.FolderExists(strPath) Then WScript.Echo "Folder path does not exist." WScript.Quit Else 'Remove any trailing slash If Right(strPath, 1) = "\" Then strPath = Left(strPath, Len(strPath) - 1) End If End If Set objFso = Nothing If Not IsNull(strPath) And strPath <> "" Then strQuery = strPath & "\" & strFile Else strQuery = strFile End If strQuery = Replace(strQuery, "*", "%") strQuery = Replace(strQuery, "?", "_") strQuery = Replace(strQuery, "\", "\\") strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}\\" & strComputer & "\root\cimv2") Set colFiles = objWMIService.ExecQuery _ ("Select * From CIM_DataFile Where FileName Like '" & strQuery & "'") For Each objFile in colFiles WScript.Echo "Access mask: " & objFile.AccessMask WScript.Echo "Archive: " & objFile.Archive WScript.Echo "Compressed: " & objFile.Compressed WScript.Echo "Compression method: " & objFile.CompressionMethod WScript.Echo "Creation date: " & objFile.CreationDate WScript.Echo "Computer system name: " & objFile.CSName WScript.Echo "Drive: " & objFile.Drive WScript.Echo "8.3 file name: " & objFile.EightDotThreeFileName WScript.Echo "Encrypted: " & objFile.Encrypted WScript.Echo "Encryption method: " & objFile.EncryptionMethod WScript.Echo "Extension: " & objFile.Extension WScript.Echo "File name: " & objFile.FileName WScript.Echo "File size: " & objFile.FileSize WScript.Echo "File type: " & objFile.FileType WScript.Echo "File system name: " & objFile.FSName WScript.Echo "Hidden: " & objFile.Hidden WScript.Echo "Last accessed: " & objFile.LastAccessed WScript.Echo "Last modified: " & objFile.LastModified WScript.Echo "Manufacturer: " & objFile.Manufacturer WScript.Echo "Name: " & objFile.Name WScript.Echo "Path: " & objFile.Path WScript.Echo "Readable: " & objFile.Readable WScript.Echo "System: " & objFile.System WScript.Echo "Version: " & objFile.Version WScript.Echo "Writeable: " & objFile.Writeable Next 

编辑……….

您可以使用带有__InstanceCreationEvent的WMI事件脚本来监视特定文件夹中的新文件创建。 它看起来像这样:

 strSource = "C:\\somefilepath\\withdoubleshlashes" strComputer = "." Set objWMIService = GetObject("winmgmts:" & strComputer & "rootcimv2") Set colEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _ & "Targetinstance ISA 'CIM_DirectoryContainsFile' AND " _ & "TargetInstance.GroupComponent= " _ & "'Win32_Directory.Name=""" & strSource & """'") Do While True Set objEvent = colEvents.NextEvent() copyFile(objEvent.TargetInstance.PartComponent) Loop 

有关完整说明,您可以阅读我的博客上的“ 监控和存档新创建的文件 ”。

这个答案使用正则表达式。 为了使它工作,它重写你的模式格式为正则表达式格式。 例如*.txt将变成^.*[.]txt$

以下列出了C:\Temp上次5:55 AM和6:05 AM之间修改的文本文件:

 strPath = "C:\Temp" strFile = "*.txt" startTime = 555 endTime = 605 Set fso = CreateObject("Scripting.FileSystemObject") Set folder = fso.GetFolder(strPath) Set files = folder.Files Set re = New RegExp re.IgnoreCase = true re.Pattern = "^" + Replace(Replace(strFile, ".", "[.]"), "*", ".*") + "$" For Each f in Files Set matches = re.Execute(f.Name) If matches.Count > 0 Then HM = Hour(f.DateLastAccessed) * 100 + Minute(f.DateLastAccessed) If HM >= startTime And HM <= endTime Then WScript.Echo f.Name, f.DateLastAccessed End If End If Next 

参考文献:

  • 正则表达式(RegExp)对象

  • 正则表达式和操作符

  • 微软用正则表达式加强VBScript

  • 嘿,脚本专家! 提高正则表达式的眉毛

对于你的例子,最简单的方法是使用inStr(In String)函数。 我发现它在99%的通配符任务中起作用。 所以,在你的例子中,而不是使用:

 If file.Name = fileName Then 

使用:

 If inStr(file.Name, filename) Then 

这实际上并不允许使用通配符(*),因为它不会找到匹配项(在参数中带有星号),所以您需要从字符串中去掉通配符并将其替换为空(或者只是训练用户不要使用通配符):

 Replace(filename,"*", "") 

但是,inStr函数允许部分或全部匹配,这使得它适用于大多数通配符任务。 因此,如果您的文件名是pic.jpg,用户是否搜索:

图片或JPG或P或C或PI等

它会返回一个匹配。 请记住,instr函数返回一个数字,其中的匹配显示在字符串中。 所以,如果它不创建匹配,结果将是0.我已经遇到了NOT运行的例子,或者我需要使用在这种情况下,将完整的语法:

 If inStr(file.Name, filename)<>0 Then