2012-10-31 205 views
5

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

  1. 读folder.txt
  2. 公开赛在folder.txt列出的文件
  3. 回声的test.txt
  4. 读文件夹列表里面的内容。 TXT
  5. 开启在文件夹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 

什么文件夹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。任何解决方案?

回答

15

线

Set listFile = fso.OpenTextFile(aniLines).ReadAll 

不会原因有二:

分配 对象变量的时候,但 ReadAll返回一个字符串
  • Set才能使用。
  • 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方法(这是preferrable当你不得不处理大文件,因为它避免了内存耗尽):

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对象并使用该实例在脚本的其余部分。一遍又一遍地实例化它毫无意义。

+2

+1,不过我建议使用'ReadLine'只是因为它使得很多更有意义则'ReadAll'&'Split'combo。 –