VBScript - уведомление, когда файл не создан сегодня

Цель: запустить сценарий VBScript, который ежедневно проверяет папку и сообщает, не были ли в ней сохранены файлы в этот день. Игнорируйте файлы, которые существуют с предыдущих дней.

Сценарий: файл журнала создается каждый день в C:\Temp в 3 часа ночи. Это то, что говорит нам о том, что система выполнила задачу. Если файл журнала не создается, задача завершается со сбоем. Я написал это, чтобы проверить папку 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, заполненный файлом, измененным сегодня, и файлом, измененным 10.07.12. Поскольку этот сценарий соответствует как оператору «тогда», так и оператору «иначе», он выполняет и то, и другое.

Я думаю, что мне просто нужно немного изменить цикл, чтобы сообщить об этом - Игнорировать файлы, не датированные «сегодня» - Отправить электронное письмо, если сегодня файлов не существует.

Любая помощь будет потрясающей. Я просто не могу "видеть" ответ.


person Billie Hawkins    schedule 12.07.2012    source источник


Ответы (3)


Вы близко. Проблема в том, что вы перебирали и проверяли каждый файл. Вам нужно только проверить, не существует ли один файл. Я не очень хорошо знаком с 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
person Ghost    schedule 12.07.2012

Я бы предложил сначала удалить время из проверки даты

Во-вторых, поскольку вы заявили, что файл создается каждую ночь, я бы проверил 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 
person Sorceri    schedule 12.07.2012

Этот скрипт:

  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 Now!) в цикле и демонстрирует важность кода вы не пишете (например: Установить папку = ..., если (найдено = ложь) ..).

person Ekkehard.Horner    schedule 12.07.2012