目标:运行每天检查一个文件夹的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'语句,所以它同时执行这两个操作。
我想我只需要对循环稍作修改即可告诉它 - 忽略未标记为“今天”的文件 - 如果今天没有文件,请发送电子邮件。
任何帮助都会很棒。我似乎无法“看到”答案。
答案 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)..)。