从第二个.vbs执行时,VBScript(.vbs)产生错误

时间:2019-05-22 22:17:05

标签: arrays csv vbscript onbase

我们有一个供应商,向我们发送CSV索引文件供我们的OnBase文档导入软件使用。如果CSV文件是使用我们的一种机构形式生成的,则OnBase会在不包含错误的情况下提取它们,因为我们已经设置了与CSV文件中第一个定界值匹配的相应文档类型。但是,如果CSV文件是使用供应商表格生成的,则第一个定界值会略有不同,并会产生OnBase索引错误。我们的供应商为许多客户使用此CSV格式,并表示无法对其进行自定义以匹配我们当前的OnBase文档类型(不包含$$$)。

我的任务是确定一种解决方法,并在OnBase处理之前找到了另一个使用VBScript创建CSV索引文件的机构。经过一些合作,我能够使用VBScript编写类似的方法。但是,由于我们已经收到了索引文件,因此我们的方法可以确定目标文件夹中有多少个CSV文件,通过循环打开每个文件夹,确定CSV文件中的第一个定界值,然后通过切换大小写方法比较该值,更新基于切换大小写方法的第一个定界CSV值,然后保存文件,直到循环结束(循环值=目标文件夹中文件的数量-1 ...以说明vbs文件)。当我单击vbs文件时,它就像一个超级按钮!

这是麻烦开始的地方。如果我尝试从另一个vbs文件运行vbs文件,该脚本将产生错误:找不到文件。我提供了一些调试代码,并且可以看到它正确地计算了目标文件夹中的文件数,等等。当我认为找不到目标文件夹时,我通过在测试过程中对路径进行编码来解决这一问题。即使确定可以找到正确的目标文件夹,我也会收到相同的“找不到文件”错误。如果我双击完全相同的vbs文件,则该文件运行无错误,并且所有CSV文件均已正确更新。

更新 @Ansgar Wiechers解决了查找并保留正确文件路径值的问题。但是,我仍然在第163行收到“找不到文件”错误。

Screenshot of error message.

  

第163行
  字符1
  错误:找不到文件
  代号:800A0035
  来源:Microsoft VBScript运行时错误

另一方面,我还注意到,我的vbs脚本仅运行一次,然后您必须在目标文件夹中复制/粘贴新实例,然后再次运行它。这使我认为我的循环永无止境,因此我包含了一个调试MsgBox,它在循环结束(或认为它已经结束)之后以及在WScript.Quit命令之前显示。这是脚本中的最后两行,并且消息框成功显示。我将从下面的两个vbs文件中添加代码。

VBScript文件#1(星号会掩盖个人信息):

Dim CurrentDirectory

Set FSO = CreateObject("Scripting.FileSystemObject")
CurrentDirectory = "C:\Users\*******\Desktop\ProVerify\Testing\ERROR_FILES\"
FSO.CopyFile "C:\Users\*******\Desktop\ProVerify\Testing\Old Source Files\VBScript_PV_Form_conversion.vbs", CurrentDirectory

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "C:\Users\*******\Desktop\ProVerify\Testing\ERROR_FILES\VBScript_PV_Form_conversion.vbs"
WshShell.Popup "VBS file will be deleted in 10 seconds...", 10
FSO.DeleteFile "C:\Users\*******\Desktop\ProVerify\Testing\ERROR_FILES\VBScript_PV_Form_conversion.vbs"

WScript.Quit

VBScript文件#2(位于CSV文件的目标文件夹中;为节省空间,删除了此帖子的开关案例代码):

' Declare vars
Dim intDebug, sFile, strDirectory, numFiles, sLine, aLine

intDebug = 1

' Find path of folder where script file resides & Set Object vars
Set objFSO = CreateObject("Scripting.FileSystemObject")
strDirectory = objFSO.GetParentFolderName(WScript.ScriptFullName)

Set objFolder = objFSO.GetFolder(strDirectory)  

' Count number of files in folder 
numFiles = objFolder.Files.Count - 1

If intDebug = 1 Then
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.Popup "File Count: " & numFiles, 2
    WshShell.Popup "File Path: " & strDirectory, 2
Else
End If

If numFiles <= 1 Then
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.Popup "No Files to Process", 2
    WScript.Quit
Else
End If  

'Loop through each file in folder
For Each folderIdx In objFolder.Files
    Set oStream = folderIdx.OpenAsTextStream

    'Read file and capture first delimeted value
    sLine = oStream.ReadLine
    oStream.Close
    aLine = Split(sLine, ",")

    ' Compare delimeted value & update to OnBase DocType naming convention
    Select Case aLine(0)
        [*****case method here*****]
    End Select

    ' Create replacement delimited value
    sLine = ""

    For i = LBound(aLine) To UBound(aLine)
        sLine = sLine + aLine(i) + ","
    Next

    'Open file and replace updated delimeted value
    Set oStream = objFSO.OpenTextFile(folderIdx.Name, 2)
    oStream.WriteLine Left(sLine, Len(sLine)-1) ' Remove comma from updated delimeted value
    oStream.Close
Next

'Reset Object vars
Set oStream = Nothing
Set objFSO = Nothing
Set objFolder = Nothing

If intDebug = 1 Then
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.Popup "Conversion Complete", 2
Else
End If

WScript.Quit

总结:

  1. 当我双击时,此代码可以正常工作(一次);那么需要将新实例复制/粘贴到目标文件夹中,然后双击才能再次运行该文件。

  2. 通过另一个vbs文件(第163行,找不到文件)运行时,
  3. 代码会产生错误。

  4. 我非常确定这可以在OnBase内完成,但是我们的OnBase Sys Admin坚持认为我不正确。另有51本OnBase用户指南涉及VBSciption超过1500次。就是说,到目前为止,我的任务是在OnBase之外找到解决方案。也可以对此主题发表评论。

1 个答案:

答案 0 :(得分:0)

您描述的错误通常是由对脚本工作目录的错误假设引起的。

您的文件夹结构显然看起来像这样(为简洁起见,简称):

C:\base\folder
├── ERROR_FILES
│   ├── a.csv
│   ├── b.csv
:   :
│   └── second.vbs
└── first.vbs

双击脚本second.vbs时,工作目录为C:\base\folder\ERROR_FILES。但是,当您双击first.vbs时,工作目录为C:\base\folder。从此处调用C:\base\folder\ERROR_FILES\second.vbs 不会更改second.vbs的工作目录。

现在让我们来看一下第二个脚本中的代码:

strDirectory = objFSO.GetAbsolutePathName(".")

'***********FOR TESTING ONLY**********************
If strDirectory = "C:\Users\*******\Desktop\ProVerify\Testing" Then
    strDirectory = objFSO.GetAbsolutePathName(".") & "\ERROR_FILES"
Else
End If
'***********FOR TESTING ONLY**********************

Set objFolder = objFSO.GetFolder(strDirectory)

...

For Each folderIdx In objFolder.Files
    Set oStream = objFSO.OpenTextFile(folderIdx.Name, 1)
    ...
Next

“仅用于测试”部分尝试通过将“ \ ERROR_FILES”附加到strDirectory来解决工作目录差异,这使您可以枚举该文件夹的内容。但是,运行objFSO.OpenTextFile(folderIdx.Name, 1)仍会尝试从当前工作目录 中打开每个文件,该目录仍为C:\base\folder

为避免此问题,请运行objFSO.OpenTextFile(folderIdx.Path),或者最好使用对象的OpenAsTextStream方法。另外,当脚本与数据文件位于同一文件夹中时,最好从脚本路径中获取目录,而不是将特定的子文件夹附加到工作目录中(这可能与您想像的不一样)。

将上面的代码片段更改为类似的代码,它将完成您想要的操作:

strDirectory  = objFSO.GetParentFolderName(WScript.ScriptFullName)
Set objFolder = objFSO.GetFolder(strDirectory)

...

For Each folderIdx In objFolder.Files
    Set oStream = folderIdx.OpenAsTextStream
    ...
Next

打开文件进行写入时使用相同的方法:

Set oStream = folderIdx.OpenAsTextStream(2)