danfiggolf
asked on
Run a VBS every 30 minutes on W2K Server
Because schtasks.exe does not run on Windows 2000 Server, and the AT command does not have this feature to allow me to schedule a vbs script to run every 30 minutes using something like:
/MO modifier
A value that refines the schedule type to allow for finer control over the schedule recurrence. Valid values are: MINUTE: 1 - 1439 minutes.
How would you recommend to have a vbs script to run every 30 minutes on a daily basis? My vbs script basically reads a log file to capture errors. It needs to run 7 days a week.
I attempted this batch job using the sleep function, but it runs a second instance only:
@echo off
:label1
cscript "D:\IVR\Utilities\ivrmonit or.vbs"
sleep 1800
goto label1
/MO modifier
A value that refines the schedule type to allow for finer control over the schedule recurrence. Valid values are: MINUTE: 1 - 1439 minutes.
How would you recommend to have a vbs script to run every 30 minutes on a daily basis? My vbs script basically reads a log file to capture errors. It needs to run 7 days a week.
I attempted this batch job using the sleep function, but it runs a second instance only:
@echo off
:label1
cscript "D:\IVR\Utilities\ivrmonit
sleep 1800
goto label1
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
The cscript line should be preceded by CALL, I think. Give that a try.
I just tested your batch script with a second batch file as code, the Call makes it run the loop continuously. One problem though: SLEEP is not a batch command you can use.
ASKER
Use call like this? So it loops - is this a good method?
@echo off
cscript "D:\IVR\Utilities\ivrmonit or.vbs"
SLEEP 1800
CALL this-same-batch-file-again .bat
EXIT
@echo off
cscript "D:\IVR\Utilities\ivrmonit
SLEEP 1800
CALL this-same-batch-file-again
EXIT
An endless loop with the TIME /T command and FINDSTR like so
time /t | findstr /c:"30" would return the string "0X:30 PM" every hour
time /t | findstr /c:"30" would return the string "0X:30 PM" every hour
"It needs to run 7 days a week...every 30 minutes on a daily basis"
Why not make the SCRIPT itself run endlessly and only do something every 30 minutes?
Why not make the SCRIPT itself run endlessly and only do something every 30 minutes?
Dim targetTime
targetTime = DateAdd("n", 30, Now) ' 30 minutes from now
While True
' check every 5 seconds to see if our targetTime has been passed
While targetTime > Now
WScript.Sleep 5000 ' (max is 32,767 --> approx 30 seconds)
Wend
' ******************************
' ... do your processing here...
' ******************************
' set next "event" for 30 minutes out...
targetTime = DateAdd("n", 30, Now) ' 30 minutes from now
Wend
I believe the solution provided by edster9999 (#a34866546) is the most robust one. Does anyone see a problem with it?
ASKER
@idlemind - you mean like this?
Dim targetTime
targetTime = DateAdd("n", 30, Now) ' 30 minutes from now
While True
' check every 5 seconds to see if our targetTime has been passed
While targetTime > Now
WScript.Sleep 5000 ' (max is 32,767 --> approx 30 seconds)
Wend
' ******************************
' ... do your processing here...
' ******************************
CONST strFolder = "D:\IVR\Logs\Monitor\"
CONST ForReading = 1
CONST ForAppending = 8
set objShell = CreateObject("WScript.Shell")
set objFSO = CreateObject("Scripting.FileSystemObject")
' Create output file for report
Set objOutput = objFSO.OpenTextfile("c:\temp\ivrFailureReport.txt", ForAppending, True)
' Call routine to find latest file and check it for errors
traverseDir strFolder, true, Nothing
' Done
objOutput.Close
Wscript.Quit
' set next "event" for 30 minutes out...
targetTime = DateAdd("n", 30, Now) ' 30 minutes from now
Wend
function traverseDir(strDir, boolSubDirs, objRecent)
set objFolder = objFSO.GetFolder(strDir)
' Loop through IVR log file directory to determine most recent file
for each objFile in objFolder.Files
if objRecent Is Nothing then
set objRecent = objFile
elseif (objFile.DateCreated > objRecent.DateCreated) then
set objRecent = objFile
end if
next
' Most recent log file has been identified
if objRecent.Size > 0 Then
Wscript.Echo "Done, most recent file = " & objRecent
' Open file
Set objInput = objFSO.OpenTextfile(objRecent, ForReading)
' Read each line of input log file to locate IVR failure point.
intCount = 0
blnError = False
Do Until objInput.AtEndOfStream
strLine = objInput.ReadLine
intCount = intCount + 1
If (InStr(strLine, "Host Error|4") > 0) Then
' Write to the server's Application Event Log file for Whatsup Gold notification.
Set WSHShell = CreateObject("WScript.Shell")
WshShell.LogEvent 1, "IVR Failed with Host Error 4"
objOutput.WriteLine strLine
blnError = True
ElseIf (blnError = True) Then
objOutput.WriteLine strLine
blnError = False
End If
Loop
objInput.Close
End If
end function
ASKER
I believe the solution provided by edster9999 (#a34866546) is the most robust one. Does anyone see a problem with it? I believe so -
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
what would be better: to have the script itself manage the task repeat OR the Windows 2000 scheduler?
Up to you. With the scheduler the script will run and them be completely removed from memory.
*Not that it would take up that much to begin with.
*Not that it would take up that much to begin with.
I think the scheduler is a more robust approach because:
1. If the server reboots, the scheduler will automatically continue running the script;
2. If the script itself manages the task repeat and it fails for whatever reason, the process will cease to run until someone restarts it. (not the case with the scheduler)
3. The scheduler works as a Windows Service unattended (no need for a user to be logged on to the server).
I hope this helps.
1. If the server reboots, the scheduler will automatically continue running the script;
2. If the script itself manages the task repeat and it fails for whatever reason, the process will cease to run until someone restarts it. (not the case with the scheduler)
3. The scheduler works as a Windows Service unattended (no need for a user to be logged on to the server).
I hope this helps.
Definitely go the scheduler approach, much cleaner.
~bp
~bp
Hi - danfiggolf
WHen you say 'I believe so'
Did you mean you do see a problem with it or you agree that it works ?
The duration bit is the expected run time of each loop.
You would set it to be every 30 minutes with a 5 or 10 minute duration.
You can tick to stop it if it is still running at this point so you do not get multiple copies running.
WHen you say 'I believe so'
Did you mean you do see a problem with it or you agree that it works ?
The duration bit is the expected run time of each loop.
You would set it to be every 30 minutes with a 5 or 10 minute duration.
You can tick to stop it if it is still running at this point so you do not get multiple copies running.