2014-10-20 97 views
-1

現在正在工作。由於某些文件名由中文字符或一些空文件組成(由於我未能完成此操作而無法正確地從vbs關閉文件創建),所以出現了一些錯誤,但我添加了日誌以便可以看到最後處理的文件。我不知道如何讓它只顯示產生錯誤的文件,但也可以。在多個文本文件中循環並替換字符

Const msoFileDialogOpen = 4 

Const ForReading = 1 
Const ForWriting = 2 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objWord = CreateObject("Word.Application") 
Set WshShell = CreateObject("WScript.Shell") 
Set myLog = objFSO.OpenTextFile("C:\my.log", ForWriting, True) 

strInitialPath = WshShell.ExpandEnvironmentStrings("E:\Filme\") 
objWord.ChangeFileOpenDirectory(strInitialPath) 

Sub Modify(f) 
    myLog.WriteLine f 
    txt = f.OpenAsTextStream.ReadAll 
    txt = Replace(txt, "ã", "a") 
    txt = Replace(txt, "â", "a") 
    f.OpenAsTextStream(2).Write txt 
End Sub 

Sub Recurse(fldr) 
    For Each sf In fldr.SubFolders 
    Recurse sf 
    Next 
    For Each f In fldr.Files 
    ext = LCase(objFSO.GetExtensionName(f.Name)) 
    If ext = "srt" Or ext = "sub" Or ext = "txt" Then Modify f 
    REM WScript.Echo f 
    Next 
End Sub 

With objWord.FileDialog(msoFileDialogOpen) 
    .Title = "Select the folder to process" 
    If .Show = -1 Then 
    For Each item in .SelectedItems 
     Recurse objFSO.GetFolder(item) 
    Next 
    Else 
    End If 
    myLog.Close 
End With 
+0

你是什麼意思的「設置爲4對所有文件」嗎? ['MsoFileDialogType'](http://msdn.microsoft.com/en-us/library/aa432520%28v=office.12%29.aspx)4意味着你可以選擇文件夾,而不是文件。 – 2014-10-20 18:08:18

+0

是的,我想選擇一個文件夾,腳本將打開其中的所有srt,sub和txt文件,進行替換並保存文件。對不起,不清楚。我編輯了我的帖子。 – 2014-10-22 13:22:33

+0

@FloRentin - 'Set txt = f.OpenAsTeStStream.ReadAll' PHOOEY! – 2014-11-12 15:05:11

回答

0

如果我理解正確,你要選擇一個文件夾,然後打開與該文件夾中的擴展.srt.sub,或.txt和所有子文件夾中的所有文件。爲此,您需要遞歸過程來遍歷文件夾子樹。將代碼修改爲第二個過程是個好主意。使代碼更簡潔。

Set objFSO = CreateObject("Scripting.FileSystemObject") 

Sub Modify(f) 
    'code for modifying the files' content goes here 
End Sub 

Sub Recurse(fldr) 
    For Each sf In fldr.SubFolders 
    Recurse sf 
    Next 
    For Each f In fldr.Files 
    ext = LCase(objFSO.GetExtensionName(f.Name)) 
    If ext = "srt" Or ext = "sub" Or ext = "txt" Then Modify f 
    Next 
End Sub 

... 

With objWord.FileDialog(msoFileDialogOpen) 
    ... 
    For Each item in .SelectedItems 
    Recurse objFSO.GetFolder(item) 
    Loop 
End With 

... 

有一些進一步的優化,你應該適用於你的代碼:

  • 這是資源的浪費在一個循環中重新創建FileSystemObject實例。在腳本開始處創建一次全局實例,並在腳本的任何位置使用該實例。
  • 無論如何,當您將整個文件讀入內存時,逐行讀取文件是毫無意義的。只需閱讀文件ReadAll並在整個文本上運行Replace
  • 在循環中使用ReDim Preserve肯定會表現不佳,因爲ReDim會重新創建該變量,並且Preserve會將舊數組實例中的所有值複製到新數組中。
  • 獲取文件對象,提取完整路徑,然後按路徑打開該文件也沒有意義。改爲使用文件對象的OpenAsTextStream方法。

像這樣的東西應該工作:

Sub Modify(f) 
    txt = f.OpenAsTextStream.ReadAll 
    txt = Replace(txt, "ã", "a") 
    txt = Replace(txt, "â", "a") 
    ... 
    f.OpenAsTextStream(2).Write txt 
End Sub 
+0

我無法讓它工作... – 2014-11-11 16:31:48

+0

@FloRentin我的錯誤。 '.SelectedItems'是字符串的集合,但'Recurse()'需要一個文件夾對象。使用'objFSO.GetFolder()'獲取給定項目的文件夾對象。查看更新的答案。 – 2014-11-12 09:10:26

+1

@AnsgarWiechers - 'Set txt = f.OpenAsTeStStream.ReadAll' PFUI! – 2014-11-12 15:04:07

相關問題