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

Arrays VBScript(.vbs)在从第二个.vbs执行时产生错误,arrays,csv,vbscript,onbase,Arrays,Csv,Vbscript,Onbase,我们有一个供应商向我们发送CSV索引文件,以便与我们的OnBase文档导入软件一起使用。如果CSV文件是使用我们的一个机构表单生成的,OnBase会在没有错误的情况下接收它们,因为我们已经设置了与CSV文件中第一个分隔值匹配的相应文档类型。但是,如果CSV文件是使用供应商表单生成的,则第1个分隔值略有不同,并会创建基于数据库的索引错误。我们的供应商为其许多客户使用此CSV格式,并表示无法对其进行自定义以匹配我们当前的OnBase文档类型(w/o$$) 我的任务是确定一个解决方法,并找到另一个机构

我们有一个供应商向我们发送CSV索引文件,以便与我们的OnBase文档导入软件一起使用。如果CSV文件是使用我们的一个机构表单生成的,OnBase会在没有错误的情况下接收它们,因为我们已经设置了与CSV文件中第一个分隔值匹配的相应文档类型。但是,如果CSV文件是使用供应商表单生成的,则第1个分隔值略有不同,并会创建基于数据库的索引错误。我们的供应商为其许多客户使用此CSV格式,并表示无法对其进行自定义以匹配我们当前的OnBase文档类型(w/o$$)

我的任务是确定一个解决方法,并找到另一个机构使用VBScript在OnBase处理之前创建CSV索引文件。经过一些合作,我能够使用VBScript编写类似的方法。但是,由于我们已经收到索引文件,我们的方法通过循环确定目标文件夹中有多少CSV文件打开每个文件,确定CSV文件中的第一个分隔值,通过开关大小写方法比较该值,根据开关大小写方法更新第一个分隔的CSV值,然后保存文件,直到循环结束(循环值=#目标文件夹中的文件-1…以说明vbs文件)。当我点击vbs文件时,它就像一个符咒

麻烦就从这里开始。如果尝试从另一个vbs文件运行vbs文件,脚本将生成错误:找不到文件。我包含了一些调试代码,我可以看到它正确地计算了目标文件夹中的文件数,等等。当我认为它找不到目标文件夹时,我在测试过程中通过对路径进行编码来解释。即使我确信它正在找到正确的目标文件夹,我也会收到相同的文件未找到错误。如果我双击完全相同的vbs文件,它将正常运行,并且所有CSV文件都会正确更新

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

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

另一方面,我注意到我的vbs脚本只会运行一次,在再次运行之前,您必须在目标文件夹中复制/粘贴新实例。这让我觉得我的循环从来没有结束过,所以我包含了一个调试
MsgBox
,它显示在循环结束后(或者认为它已经结束),就在
WScript.Quit
命令之前。这是脚本中的最后两行,消息框将成功显示。我将包含下面两个vbs文件中的代码

VBScript文件#1(星号屏蔽个人信息):

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

“声明变量
Dim intDebug、sFile、strDirectory、numFiles、sLine、aLine
intDebug=1
'查找脚本文件所在文件夹的路径并设置对象变量
设置objFSO=CreateObject(“Scripting.FileSystemObject”)
strDirectory=objFSO.GetParentFolderName(WScript.ScriptFullName)
设置objFolder=objFSO.GetFolder(strDirectory)
'计算文件夹中的文件数
numFiles=objFolder.Files.Count-1
如果intDebug=1,则
设置WshShell=WScript.CreateObject(“WScript.Shell”)
WshShell.Popup“文件计数:”&numFiles,2
弹出“文件路径:&strDirectory,2
其他的
如果结束

If numFiles您描述的错误通常是由于对脚本的工作目录的错误假设造成的

您的文件夹结构看起来有点像这样(为简洁起见,名称缩写为):

“仅用于测试”部分试图通过在
strDirectory
中添加“\ERROR\u FILES”来解释工作目录的差异,这允许您枚举该文件夹的内容。但是,运行
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)

您描述的错误通常是由于对脚本的工作目录的错误假设造成的

您的文件夹结构看起来有点像这样(为简洁起见,名称缩写为):

“仅用于测试”部分试图通过在
strDirectory
中添加“\ERROR\u FILES”来解释工作目录的差异,这允许您枚举该文件夹的内容。但是,运行
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)

谢谢,A.W.找到正确文件路径(目标文件夹)的解决方案wo
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)