我现在正在编写一个脚本,它使用文件系统对象来读取文本文件,然后将其删除。发生这种情况的代码部分我已经写成了函数。我已经测试了这个函数,以及它所依赖的一些其他函数,并且它工作正常。但在最终产品中,它只是具有16个不同功能/子程序的脚本的一部分。将其合并到最终产品后,此文件无法正常工作。或者,至少Windows脚本主机告诉我它没有。
我已经测试过使用Echo语句来追踪问题,因为WSH引用的行应该已经正确执行,这是因为当我运行脚本时,相关行之后的代码工作正常。当我在函数调用之后回显时,我得到了一个Echo(我编写了一个简单的函数,让脚本在调用更多函数之前等待,而echo语句就在那之后,所以函数肯定会在错误发生之前完成执行)。我也尝试在下一个要调用的函数的开头插入一个echo语句(字面意思是在我实例化第二个函数之后),然后我没有得到回声。
这是有问题的功能。错误引用的行是Set objRECID。
Function PullRecords
Set objWSH = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
strIP = "192.168.1.185"
strOutFileCMD = ".output OUT" & strIP & ".txt"
strOutFile = "C:\Users\" & GetLoggedOnUsername & "\Documents\SQLite3\" & "OUT" & strIP & ".txt" 'Output of each element grab
strCommand = "FROM ZCDataField WHERE RECORD_ID="
strRECIDPath = "C:\Users\" & GetLoggedOnUsername & "\Documents\SQLite3\" & "RECID" & strIP & ".txt" 'Output of GetRECID
strFinalCSVPath = "C:\Users\" & GetLoggedOnUsername & "\Documents\SQLite3\" & strIP & ".csv"
strSQLite3Path = "C:\Users\" & GetLoggedOnUsername & "\Documents\SQLite3\"
strProcName = "SQLite3.exe"
'Element ID's (for reference)
'intpt_item = "275426222"
'intpt_description = "275466434"
'intpt_custitem = "275466431"
'intpt_qty = "275466713"
'intpt_name = "275466710"
'intpt_date = "275435183"
'intpt_unixmil = "275578832"
'Options for text files
intForReading = 1
intForWriting = 2
intForAppending = 8
boolOverwriteTrue = True
boolOverwriteFalse = False
Set objCSV = objFSO.CreateTextFile(strFinalCSVPath,boolOverwriteTrue) 'Creates final CSV to be written to/
Set objRECID = objFSO.OpenTextFile(strRECIDPath,intForReading)
'Cycles through records
Do Until objRECID.AtEndOfStream
strRECID = objRECID.ReadLine
Set objELID = objFSO.OpenTextFile(strSQLite3Path & "Element IDs.txt",intForReading) 'Need this here so that script restarts at beginning of file each time.
'Cycles through elements
Do Until objELID.AtEndOfStream
Set objBAT = objFSO.CreateTextFile(strSQLite3Path & strIP & dblUnixT & ".bat",boolOverwriteTrue)
objBAT.Write ("cd /D C:\Users\" & GetLoggedOnUsername & "\Documents\SQLite3")
objBAT.WriteLine
objBAT.Write ("sqlite3 " & strIP & ".db < " & strIP & ".txt")
objBAT.Close
Set objBAT = Nothing
Set objCMDS = objFSO.CreateTextFile(strSQLite3Path & strIP & ".txt",boolOverwriteTrue)
objCMDS.Write (".mode tabs")
objCMDS.WriteLine
objCMDS.Write (strOutFileCMD)
objCMDS.WriteLine
strELID = objELID.ReadLine 'Gets ELEMENT_ID
objCMDS.Write ("SELECT VALUE_TXT,VALUE_NUM " & strCommand & strRECID & " AND ELEMENT_ID=" & strELID & ";") 'Gets element
objCMDS.WriteLine
objCMDS.Write (".exit") 'Exits SQLite3
objCMDS.Close
Set objCMDS = Nothing
objWSH.Run(strSQLite3Path & strIP & dblUnixT & ".bat")
'Makes script wait until BAT is done.
intRunning = 1
Do Until intRunning = 0
intRunning = IsRunning(strProcName)
Loop
Wscript.Sleep(500)
Set objOut = objFSO.OpenTextFile(strOutFile)
strOut = objOut.ReadLine
objOut.Close
Set objOut = Nothing
objCSV.Write strOut & ","
Loop
'Make string of line and then delete 1 character on right to get rid of ,. Then replace line.
objCSV.Write Chr(8)
objCSV.WriteLine
objELID.Close
Set objELID = Nothing
Loop
objCSV.Close
objRECID.Close
Set objCSV = Nothing
Set objRECID = Nothing
objFSO.DeleteFile strRECIDPath
'objFSO.DeleteFile strOutFile
InvertText(strFinalCSVPath)
PullRecords = strFinalCSVPath
Call FuncSubEndToken
End Function
如果它有用,这里是我调用的FuncSubEndToken函数。
Function FuncSubEndToken
intFuncSubEndToken = 1
End Function
以下是我在调用PullRecords函数时的使用方法。
Call PullRecords
'FuncSubEndTokenWait
Do Until intFuncSubEndToken = 1
Loop
intFuncSubEndToken = 0
非常感谢任何帮助。
编辑:我尝试过使用On Error Resume Next,我只是在我发布的部分之后挂起了wscript。它甚至没有进入下一个功能。
编辑2:我已经尝试注释掉删除PullRecords函数所需文件的行,即使该函数在文件完成后执行。现在显而易见的是,调用此函数两次,另一个函数调用两次(然后它会在某种程度上错误地调用它)。我看过,这两个函数只被调用一次(并且它们不在循环中,所以这绝对不是问题)。我调用一个函数,并按照它们似乎正在运行的顺序将它们传递给这两个函数的输出。但我不是在这里调用函数。但也许wscript认为我是?
编辑3:我删除了使用其他两个函数返回的函数(好了,注释掉了),我仍然遇到同样的问题。
答案 0 :(得分:0)
所以,我现在已经弄明白了这个问题。在尝试获取输出时,我似乎对函数的工作方式有些误解。我以为你调用了一个函数,然后函数名是输出。但是,似乎您不需要使用call语句来执行函数。因此,在尝试使用我的函数输出时,我无意中调用了它们。