2017-01-25 3 views
2

작업 스케줄러에서 배치 파일을 통해 VBS 파일을 호출하는 중 일부 항목이 검색되었지만 실행되지 않습니다.VBS + 작업 스케줄러를 사용하여 공유 .mdb 파일에서 레코드 수 얻기

내 경우에는 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 

에 5 분마다 실행, 어떻게 보일지의 예하지만 지금의로, 나는 단지 아래의 출력을 얻고있다.

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은 '레코드 세트가 비어 있음'을 표시해야합니다. 문제는 내 코드가 전체 레코드에 대해서만 '레코드 세트가 비어 있습니다'라는 파일을 생성하고 있다는 것입니다. 나는 윈도우 7
에게 64 비트에 - 설정 환경 변수
- 날짜 로직
- 기록을 DAO를 실행할 수 있도록 사용

-A 복사 붙여 넣기 코드 : 여기

는로 분리 내 VBS 코드입니다 나는 레코드 수의 논리에 잘못 가고 어디에 파일을

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  

을 .csv로 로직
- 출력을 계산 모르겠습니다. 우선 Set rst = oDB.OpenRecordset("SELECT DISTINCT ID FROM " & QRY_NAME & " WHERE Test_Date LIKE '*" & SQLdate & "*' ")을 사용하여 Test_Date이 내 SQLdate (항상 현재 날짜를 나타냄)과 유사한 고유 레코드 (기준으로 ID 사용)를 선택하는 것으로 시작합니다.

내 생각 엔 문제가 더 유닛이 아직 생성되지 않았다면, 내 레코드가 완전히 비어 있어야

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

이 부분에 자리 잡고 있다는 점이다. 나는이 상황을 감지하기 위해 .EOF을 사용하지만, 현재 코드는 단위가 생성되었을 때 실제 레코드 수를 기록하는 대신 항상 rst.EOF = True이라고 생각합니다. 다시, VBS 파일을 작업 스케줄러 대신 수동으로 실행할 때 정확한 레코드 수를 얻을 수 있습니다. 여기

사용하여 내가

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)를 호출 카운트 레코드 ID 및 Test_Date를 조회 할 경우 수 (.mdb) 파일을 다음 클라우드 데이터베이스의 예 코드 :

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 

누구나 내가이 문제를 해결하는 방법을 알 수 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

+2

참고로, 귀하의 MDB 파일이 "클라우드"에 있지 않은 LAN의 네트워크 공유에 있기 때문입니다. 귀하의 질문에서 그 구절을 제거하십시오, 그것은 오해의 소지가 있습니다. – Tomalak

+0

좋은 점, 편집 해 주셔서 감사합니다. – Joshua

답변

1

내 VBS 파일이 작업 스케줄러에서 작동하지 않지만 수동으로 실행하면 작동합니다.

그렇다면 어떻게 코드를 변경해야하는지 알 수 없습니다.

오작동의 원인은 예약 된 작업이 할당 된 계정입니다.

데이터베이스 파일에 대한 액세스 권한을 부여한 예약 된 작업에 사용자 계정을 할당 (생성)하십시오.

편집 :

where 절이 잘못되었습니다. 그것은 읽어야합니다 :

+1

죄송합니다. 다시 말해야합니다 - 작업 스케줄러가 VBS 코드를 실행하지만 올바르게는 아닙니다. VBS 파일을 하루 종일 실행할 수 있으며 실제 레코드 수 대신 '레코드 세트가 비어 있습니다.'라는 출력을 볼 수 있습니다. 이는 내가 원하는 것은 아닙니다. 예약 된 작업에 사용자 계정이 할당되어 있다고 생각합니다. 정확히 내가 확인할 수있는 위치를 알고 계십니까? Task Scheduler를 설정하지 않았고 VBS 코드 만 썼습니다. 다음은 일부 설정 [스냅 샷]입니다 (http://imgur.com/a/94h69) – Joshua

+0

@ Joshua 사용자가 로그온했을 때만 실행하고 싶은 경우, 기록중인 사용자에 관계없이 실행하지 않는 이유는 무엇입니까? 더 나은가? – Lankymart

+0

where 절이 될 수 있습니다. 편집을 참조하십시오. – Gustav

관련 문제