5

我无法让 vbscript 逐行读取文本。这是代码应该执行的步骤:

  1. 阅读文件夹.txt
  2. 打开 folder.txt 中列出的文件
  3. 回显 test.txt 中的内容
  4. 阅读文件夹列表.txt
  5. 打开 folder-list.txt 中列出的文件
  6. 打开 dirlist.txt 并逐行回显

folder.txt 包含的示例:

C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\test.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[12CUT] _____ (Gakkou no Kaidan) [518382]\test.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[2____] _____!__CD__________ [521206]\test.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[Ability] _____________________ [514182]\test.txt

folder-list.txt 包含的示例:

C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\dirlist.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[12CUT] _____ (Gakkou no Kaidan) [518382]\dirlist.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[2____] _____!__CD__________ [521206]\dirlist.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[Ability] _____________________ [514182]\dirlist.txt

每个 dirlist.txt 包含的示例

C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\00.jpg
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\a_01.jpg
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\a_02.jpg
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\a_03.jpg

这是vbscript代码

Option Explicit

Dim objFSO, strTextFile, strData, strLine, arrLines, aniTextFile, aniData, aniLines, meLine, objTextFile, fso, inputFileList, sFolderName, fname
Dim iim1, iret, iret2, iret3, i
CONST ForReading = 1

strTextFile = "C:\Documents and Settings\Administrator\Desktop\ArtistCG\folder.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
strData = objFSO.OpenTextFile(strTextFile,ForReading).ReadAll
arrLines = Split(strData,vbCrLf)

For Each strLine in arrLines
  strData = objFSO.OpenTextFile(strLine,ForReading).ReadAll
WScript.Echo strData

aniTextFile = "C:\Documents and Settings\Administrator\Desktop\ArtistCG\folder-list.txt"

Set objFSO = CreateObject("Scripting.FileSystemObject")
aniData = objFSO.OpenTextFile(aniTextFile,ForReading).ReadAll
aniLines = Split(aniData,vbCrLf)

Set fso = CreateObject("Scripting.FileSystemObject")
Set listFile = fso.OpenTextFile(aniLines).ReadAll
do while not listFile.AtEndOfStream 
    fName =  listFile.ReadLine()
    WScript.Echo fName
    Loop
Next

到目前为止,我只完成了步骤 1 到 4,但我无法让它读取 dirlist.txt。这里有什么解决方案吗?

4

1 回答 1

15

线

Set listFile = fso.OpenTextFile(aniLines).ReadAll

不起作用有两个原因:

  • Set只能在将对象分配给变量时使用,但ReadAll返回一个字符串
  • OpenTextFile()需要一个字符串,但aniLines它是一个字符串数组

要处理数组的所有元素,您可以使用如下内容:

For Each line In aniLines
  ' read dirlist.txt file
Next

问题是您要如何读取dirlist.txt文件。您可以对其他文件执行相同操作:读取文件的全部内容并将其拆分为一个数组:

listFile  = fso.OpenTextFile(line).ReadAll
listLines = Split(listFile, vbCrLf)

然后使用像上面那样的另一个循环来处理数组的字段listLines。这种方法更适合小文件,因为代码更简单。

或者您可以使用该ReadLine方法(当您必须处理大文件时最好使用该方法,因为它可以避免内存耗尽):

Set listFile = fso.OpenTextFile(line)  ' <-- remove .ReadAll from this line!
Do Until listFile.AtEndOfStream
  fName = listFile.ReadLine
  ' do stuff with fName
Loop

我推荐使用Do Until而不是Do While Not,因为语义相同,但前者更接近自然语言,因此更易于阅读。

FileSystemObject此外,在脚本的开头实例化一个对象并在脚本的其余部分中使用该实例就足够了。一遍又一遍地实例化它是没有意义的。

于 2012-10-31T02:42:11.090 回答