使用VBS +任务计划程序

时间:2017-01-25 05:12:40

标签: csv ms-access vbscript scheduled-tasks

我搜索了一些主题,其中通过任务计划程序上的批处理文件调用VBS文件,但它没有运行。

在我的情况下,我的VBS文件确实在任务计划程序上运行,但我从共享数据库(.mdb)获取记录计数的逻辑无法正常工作。理想情况下,我的VBS文件将检查当天已经制作了多少单位,并输出相应的DATE,TIME和TOTAL单位,DATE和TIME是固定值,TOTAL是我的记录计数。

*应该注意的是,虽然我的VBS文件在任务计划程序上无法正常工作,但在手动运行时它可以正常工作。这是我无法解决的问题。

以下是我的输出(.csv)文件应该是什么样子的示例,在任务计划程序上每五分钟运行一次

DATE        TIME    TOTAL
01/13/2017  16:30   165
01/13/2017  16:35   169
01/13/2017  16:40   173
01/13/2017  16:45   176
01/13/2017  16:50   179

但截至目前,我只收到以下输出。

DATE        TIME    TOTAL
01/13/2017  16:30   recordset is empty
01/13/2017  16:35   recordset is empty
01/13/2017  16:40   recordset is empty
01/13/2017  16:45   recordset is empty
01/13/2017  16:50   recordset is empty

任务计划程序每天从上午7点到晚上10点运行此VBS代码。如果尚未生成任何单位,则TOTAL应显示“记录集为空”,直到生成单位为止。问题是,我的代码一整天都只生成'记录集为空'的文件。

这是我的VBS代码,分为:

- 我曾经能够在64位Windows 7上运行DAO的复制粘贴代码 - 设置环境变量
- 日期逻辑
- 记录计数逻辑
- 输出到.csv文件

    Option Explicit
    '////////////////////////////////IGNORE - COPY PASTED TO GET DAO.DBENGINE.36 RUNNING//////////////////////////
    CheckOSx86x64Args()
     dim JRO, SC, DAO
     Rem main code begins here
     Set JRO = CreateObject("JRO.JetEngine")
     Set SC = CreateObject("ScriptControl")
     Set DAO = CreateObject("DAO.DBEngine.36")

     Sub CheckOSx86x64Args()
         Dim CmdLn, Arg
         With CreateObject("WScript.Shell")
             If Replace(LCase(WScript.Path), LCase(.ExpandEnvironmentStrings("%windir%\")), "") = "system32" Then
                 CmdLn = Replace(LCase(WScript.FullName), "system32", "syswow64")
                 If CreateObject("Scripting.FileSystemObject").FileExists(CmdLn) Then
                     CmdLn = CmdLn & " """ & WScript.ScriptFullName & """"
                     For Each Arg In WScript.Arguments
                         CmdLn = CmdLn & " """ & Arg & """"
                     Next
                     .Run CmdLn, 1, True 'added " ,1, True " in hopes of waiting until whatever process is running is done. read into bwaitonreturn
                     WScript.Quit
                     End If
             End If
         End With
     End Sub
'////////////////////////////////////////////ENVIRONMENT/////////////////////////////////////////////////////
'////////////////////////////////////////////////////////////////////////////////////////////////////////////
'On Error Resume Next
Const ForWriting = 2
Const ForAppending = 8 
Dim rst, oJet, oDB 'As DAO.DBEngine, DAO.Database, DAO.Recordset
Dim fso, GetTheBase 
Dim formatDate, SQLdate, csvCurrentTime 'date format
Dim counterFSO, activeWbTest, objworkbook, objLogFile
Dim origLP, destpath
Dim Total 
Const QRY_NAME = "Results" 'Table to export

csvCurrentTime = Hour(now) & ":" & Minute (now)

origLP = "\\192.168.1.240\ProductionSrvr2\SIMULATION\LongPulse.mdb"
destpath = "\\192.168.1.240\ProductionSrvr2\PROGRESS_LOGS\SM"
'///////////////////////////////////////////////DATE/////////////////////////////////////////////////////////
'////////////////////////////////////////////////////////////////////////////////////////////////////////////
'check if date provided as an argument;if provided, use that data, otherwise, determine date
If WScript.Arguments.Count > 0 Then
    SQLdate = WScript.Arguments.Item(0) 'Query date, MM/DD/YYYY with 0's
    formatDate = Replace(SQLdate,"/","")'File extension date
Else
    SQLdate = Right("0" & Month(Now()), 2)& "/" & Right("0" & Day(Now()), 2)& "/" & Year(Now()) 'Query date
    'SQLdate = "01/13/2017"
    formatDate = Replace(SQLdate,"/","")'File extension date
End If
'//////////////////////////////////////////////RECORDCOUNT LOGIC/////////////////////////////////////////////
'////////////////////////////////////////////////////////////////////////////////////////////////////////////
Set fso = CreateObject("Scripting.FileSystemObject")
GetTheBase = "SM_" & formatDate & ".csv"    'adding csv to the file

Set oJet = CreateObject("DAO.DBEngine.36")
Set oDB = oJet.OpenDatabase(origLP)
'Query database for 'distinct ID' from table 'Results' where the column 'Test_Date' contains the system date
Set rst = oDB.OpenRecordset("SELECT DISTINCT ID FROM " & QRY_NAME & " WHERE Test_Date LIKE '*" & SQLdate & "*' ")
If rst.EOF = True Then 
    Total = "recordset is empty"
Else
    Total = rst.RecordCount
End If
oDB.Close
Set oDB = Nothing
Set oJet = Nothing
'//////////////////////////////////////OUTPUT TO .CSV FILE///////////////////////////////////////////////////
'////////////////////////////////////////////////////////////////////////////////////////////////////////////
'checks if .csv file already exists. If it doesn't, it creates file with headers. If it does, it skips the 'if' statement
Set counterFSO = CreateObject("Scripting.FileSystemObject")
If Not counterFSO.FileExists(GetTheBase) Then
    Set objLogFile = counterFSO.CreateTextFile(GetTheBase, ForWriting)
    objLogFile.Writeline chr(34) & _ 
    "DATE" & chr(34) & "," & chr(34) & _ 
    "TIME" & chr(34) & "," & chr(34) & _ 
    "TOTAL" & chr(34) & "," 
    Set objLogFile = nothing 'prevents "permission denied" error.set objLogFile to nothing for the next .opentextfile action
End If
Set objLogFile = counterFSO.OpenTextFile(GetTheBase, ForAppending)
objLogFile.Writeline chr(34) & _ 
SQLdate & chr(34) & "," & chr(34) & _ 
csvCurrentTime & chr(34) & "," & chr(34) & _ 
Total & chr(34) & "," 
Set objLogFile = nothing    

我不确定我在记录计数逻辑中出错了。我首先使用SQL语句Set rst = oDB.OpenRecordset("SELECT DISTINCT ID FROM " & QRY_NAME & " WHERE Test_Date LIKE '*" & SQLdate & "*' ")来选择唯一记录(使用ID作为标准),其中Test_Date类似于我的SQLdate(它总是代表当天)。 / p>

我的猜测是问题在于本节

If rst.EOF = True Then 
    Total = "recordset is empty"
Else
    Total = rst.RecordCount
End If

如果还没有制作单位,我的记录集应该是完全空的。我使用.EOF来检测这种情况,但截至目前,代码始终认为rst.EOF = True而不是在生成单位时记录实际记录计数。同样,当手动运行VBS文件而不是任务计划程序时,它可以获得正确的记录计数。

以下是云数据库(.mdb)文件的示例,其中我查询ID和Test_Date以获取记录计数

Title   Comment  ID         Test_Date   Test_Time   Pmax
AU29    PL1      H160019608 01/13/2017  1:03:16 PM  351.9642
AU29    PL1      H160019917 01/13/2017  1:03:35 PM  351.9942
AU29    PL1      H160019940 01/13/2017  1:03:56 PM  356.2267
AU29    PL1      H160019940 01/13/2017  1:04:17 PM  356.2153

批处理文件只需使用以下代码调用我的.vbs文件(UniqueCounter.vbs):

set SM_DEST="\\192.168.1.240\ProductionSrvr2\PROGRESS_LOGS\SM"
set sim_count="\\192.168.1.240\ProductionSrvr2\PROGRESS_LOGS\BIN\UniqueCounter.vbs"

REM collect simulation data
pushd %SM_DEST%
%sim_count%
popd

任何人都知道如何解决此问题?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

虽然我的VBS文件在任务计划程序上不起作用,但它确实有用   手动运行。

然后我不知道你将如何以及为何更改代码。

出现故障的原因是分配了计划任务的帐户。

将(创建)用户帐户分配给您授予访问数据库文件权限的计划任务。

编辑:

你的where子句是错误的。它应该是:

tf.setText(tf.getText() + "X");