VBScript - 今天未创建文件时的通知

时间:2012-07-12 18:12:30

标签: file if-statement vbscript exists last-modified

目标:运行每天检查一个文件夹的VBScript,并报告当天是否没有文件保存到该文件夹​​。忽略前几天存在的文件。

场景:每天凌晨3点在C:\ Temp中创建一个日志文件。这就是告诉我们系统执行任务的原因。如果未生成日志文件,则任务崩溃。我写这个是为了查看今天创建的文件的Temp文件夹,如果它不存在,给我发电子邮件。

到目前为止的解决方案:

option explicit 
dim fileSystem, folder, file 
dim path  
path = "C:\Temp" 

Set fileSystem = CreateObject("Scripting.FileSystemObject") 
Set folder = fileSystem.GetFolder(path) 

for each file in folder.Files     
  if file.DateLastModified > dateadd("h", -24, Now) then 
'WScript.Echo file.Name & " last modified at " & file.DateLastModified 
else 
SendEmail
'WScript.Echo "this should have sent an email."
  end if 
next 

Function SendEmail() 
 'Send Email notification function here (this part works already)
End Function

问题我有:

我似乎无法绕过一种让脚本忽略前几天文件夹中的文件的方法。

在我的测试中,我有C:\ Temp populuated今天修改的文件,以及在7/10/12修改的文件。因为这个场景匹配'then'和'else'语句,所以它同时执行这两个操作。

我想我只需要对循环稍作修改即可告诉它 - 忽略未标记为“今天”的文件 - 如果今天没有文件,请发送电子邮件。

任何帮助都会很棒。我似乎无法“看到”答案。

3 个答案:

答案 0 :(得分:1)

你很亲密。问题是你是在循环并检查每个文件。您只需要检查一个文件是否不存在。我对vbscript并不熟悉,所以你可能需要稍微调整一下,但我所做的是添加变量found并将其初始化为false。如果您找到过去24小时内创建的文件,请将其设置为true。完成循环后,如果它仍然是false,则过去24小时内没有修改任何文件

option explicit 
dim fileSystem, folder, file 
dim path  
Dim found
found = false
path = "C:\Temp" 

Set fileSystem = CreateObject("Scripting.FileSystemObject") 
Set folder = fileSystem.GetFolder(path) 

for each file in folder.Files     
  if file.DateLastModified > dateadd("h", -24, Now) then 
    found = true
  end if 
next 
if (found = false) then
  SendEmail
End If


Function SendEmail() 
 'Send Email notification function here (this part works already)
End Function

答案 1 :(得分:0)

我建议先从日期检查中删除时间

第二,既然你说过每晚创建文件我会检查DateCreated而不是DateModified。

我修改了下面的代码,添加了一个变量Dim myDate,然后将其设置为前一天

Dim myDate
myDate =  dateadd("d", -1, FormatDateTime(Now, 2))
然后我改变了行

if file.DateCreated > myDate then 

查看新变量。
使用echo命令运行它按照您的描述工作 并通知我只有今天创建的文件。

option explicit
dim fileSystem, folder, file  
dim path   
path = "C:\Temp"   
Set fileSystem = CreateObject("Scripting.FileSystemObject")  
Dim myDate
myDate =  dateadd("d", -1, FormatDateTime(Now, 2))
Set folder = fileSystem.GetFolder(path)   
for each file in folder.Files
    if file.DateCreated > myDate then  
        'WScript.Echo file.Name & " last modified at " & file.DateCreated   
        SendEmail 
    'WScript.Echo "this should have sent an email."   
    end if  
next

Function SendEmail()   
'Send Email notification function here (this part works already) 
End Function 

答案 2 :(得分:0)

这个脚本:

  Option Explicit

  ' config data, fixed
  Const csPATH = "..\data"

  ' config data, computed, show use of DateValue() to cut off time
  Dim dtCheck : dtCheck = DateValue(DateAdd("d", 0, Now))
  WScript.Echo "dtCheck:", dtCheck

  Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject")

  Dim bFound : bFound = False ' assume no up-to-date file found
  Dim oFile
  For Each oFile In oFS.GetFolder(csPATH).Files
      WScript.Echo "Check:", DateValue(oFile.DateLastModified), oFile.Name
      If DateValue(oFile.DateLastModified) = dtCheck Then
         WScript.Echo "Found:", DateValue(oFile.DateLastModified), oFile.Name
         WScript.Echo "no need for further loopings"
         bFound = True
         Exit For
      End If
  Next
  If Not bFound Then
     WScript.Echo "Sending email ..."
  End If

输出1:

dtCheck: 12.07.2012
Check: 11.07.2012 11434579.kpf
Check: 11.07.2012 11434579.notes
Check: 11.07.2012 11434579-UE15.prj
Sending email ...

输出2:

dtCheck: 12.07.2012
Check: 11.07.2012 11434579.kpf
Check: 11.07.2012 11434579.notes
Check: 11.07.2012 11434579-UE15.prj
Check: 12.07.2012 11458011.notes
Found: 12.07.2012 11458011.notes
no need for further loopings

通过在找到最新文件后立即断开/退出循环来扩展Ghost的方法,避免在循环中重新计算检查日期(基于volatile!) ,并演示了您不写的代码的重要性(例如:Set folder = ...,If(found = false)..)。