我搜索了一些主题,其中通过任务计划程序上的批处理文件调用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
任何人都知道如何解决此问题?任何帮助将不胜感激。
答案 0 :(得分:1)
虽然我的VBS文件在任务计划程序上不起作用,但它确实有用 手动运行。
然后我不知道你将如何以及为何更改代码。
出现故障的原因是分配了计划任务的帐户。
将(创建)用户帐户分配给您授予访问数据库文件权限的计划任务。
编辑:
你的where子句是错误的。它应该是:
tf.setText(tf.getText() + "X");