5

vbscript を作成してテキストを 1 行ずつ読み取るのに問題があります。これは、コードが実行する必要がある手順です。

  1. folder.txt を読む
  2. folder.txt にリストされているファイルを開きます
  3. test.txt 内の内容をエコーする
  4. folder-list.txt を読む
  5. folder-list.txt にリストされているファイルを開きます
  6. dirlist.txt を開き、1 行ずつエコーします

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

次の 2 つの理由で機能しません。

  • Setオブジェクトを変数に代入する場合にのみ使用できますが、 stringReadAllを返します。
  • 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 に答える