2014-10-20 61 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

相关问题