Я просмотрел несколько тем, где VBS-файл вызывается через командный файл в планировщике задач, но он не запускается.Получение количества записей из общего .mdb-файла с помощью VBS + Task Scheduler
В моем случае мой 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
Планировщик заданий запускает этот код VBS с 7 AM-10PM каждый день. Если единицы еще не были созданы, тогда TOTAL должен показать, что «набор записей пуст», пока не будет произведено устройство. Проблема в том, что мой код генерировал файлы только «recordset is empty» в течение целого дня.
Вот мой VBS код, разделяется на:
-A копия вставленного кода, который я использовал, чтобы иметь возможность запускать DAO на 64-битной Windows 7
-Установка переменные окружения
-Date логики
-record подсчитывать логики
-output в файл .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
(который всегда является представителем текущего дня).
Я думаю, что проблема заключается в этом разделе
If rst.EOF = True Then
Total = "recordset is empty"
Else
Total = rst.RecordCount
End If
Если единицы не было произведено еще, мой записей должен быть совершенно пуст. Я использую .EOF
, чтобы обнаружить это обстоятельство, но на данный момент код думает rst.EOF = True
все время вместо того, чтобы записывать фактическое количество записей, когда были произведены единицы. Опять же, когда файл VBS запускается вручную, а не в Task Scheduler, он может получить правильный счетчик записей.
Вот пример базы данных облака (MDB) файл, в котором я запрашиваю идентификатор и 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
Кто-нибудь знает, как я могу решить проблему? Любая помощь будет принята с благодарностью.
FYI, только потому, что ваш файл MDB находится в сетевой папке в вашей локальной сети, это не «в облаке». Просто удалите этот отрывок из вашего вопроса, это вводит в заблуждение. – Tomalak
Хорошая точка, спасибо за редактирование – Joshua