用文件名替换特定的字符串?

时间:2017-01-17 16:48:53

标签: vbscript

如何用文件名替换特定字符串?示例:我在包含文本" ABC123"的子文件夹中有几个具有不同名称的文件(如:Test.asp,Constant.asp,Letter.asp等)。我想更换" ABC123"在每个文件中使用文件名。 下面是我找到字符串并用特定字符串替换它的代码,但它没有完成我上面列出的工作。

Option Explicit
Dim objFilesystem, objFolder, objFiles, objFile, tFile, objShell, objLogFile,objFSO, objStartFolder, colFiles
Dim SubFolder, FileText, bolWriteLog, strLogName, strLogPath, strCount, strCount2, strOldText, strNewText, strEXT
bolWriteLog = True
Const ForReading = 1
Const ForWriting = 2
Const TriStateUseDefault = -2
Set objFilesystem = WScript.CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
strLogName = "log.txt"
strLogPath = "C:\" & strLogName

strCount = 0
strCount2 = 0
strOldText = "ABC123"
strNewText = ""
strEXT = "asp"

'Initialize log file
If bolWriteLog Then
  On Error Resume Next
  Set objLogFile = objFileSystem.OpenTextFile(strLogPath, 2, True)
  WriteLog "############### Start Log ##################"
  If Not Err.Number = 0 Then
    MsgBox "There was a problem opening the log file for writing." & Chr(10) & _
       "Please check whether """ & strLogPath & """ is a valid file and can be openend for writing." & _
       Chr(10) & Chr(10) & "If you're not sure what to do, please contact your support person.", vbCritical, "Script Error"
    WScript.Quit
  End If
  On Error Goto 0
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "D:\MyFolder"

Set objFolder = objFSO.GetFolder(objStartFolder)
WScript.Echo objFolder.Path
Set colFiles = objFolder.Files
For Each objFile In colFiles
  'WScript.Echo objFile.Name
  ' Now we have an exception for all files that can not be opened in text modus: all extensions such as "exe" should be listed upfront.
  ReplaceText(objFile) 
Next

ShowSubfolders objFSO.GetFolder(objStartFolder)

Sub ReplaceText(objFile)
  If InStr(1, strEXT, Right(LCase(objFile.Name), 3)) = 0 Or objFile.Size = 0 Then
  Else
    strCount = strCount + 1
    WriteLog("Opening " & objFile.Name)
    Set tFile = objFile.OpenAsTextStream(ForReading, TriStateUseDefault)
    FileText = tFile.ReadAll
    tFile.Close
    If InStr(FileText, strOldText) Then
      WriteLog("Replacing " & strOldText & " with " & strNewText & ".")
      FileText = Replace(FileText, strOldText, strNewText)
      WriteLog("Text replaced")
    Else
      WriteLog(strOldText & " was not found in the file.")
      strCount2 = strCount2 + 1
    End If
    Set tFile = objFile.OpenAsTextStream(ForWriting, TriStateUseDefault)
    tFile.Write FileText
    tFile.Close
    FileText = ""
    strCount = 0
    strCount2 = 0
  End If
End Sub

Sub ShowSubFolders(Folder)
  For Each Subfolder in Folder.SubFolders
    'WScript.Echo Subfolder.Path
    Set objFolder = objFSO.GetFolder(Subfolder.Path)
    Set colFiles = objFolder.Files
    For Each objFile in colFiles
      'WScript.Echo objFile.Name
      ReplaceText(objFile)
    Next
    ShowSubFolders Subfolder
  Next
End Sub

WriteLog "###############  EndLog  ##################"

WScript.Echo "Script Complete"
objShell.Run "C:\" & strLogName

'Clear environment and exit
On Error Resume Next

Set tFile = Nothing
Set objFile = Nothing
Set objFiles = Nothing
Set objFolder = Nothing
Set objLogFile = Nothing
Set objFilesystem = Nothing
Set objShell = Nothing

WScript.Quit

'Subs and functions ********** DO NOT EDIT ***************

Sub WriteLog(sEntry)
  If bolWriteLog Then objLogFile.WriteLine(Now() & ": Log:      " & sEntry)
End Sub

1 个答案:

答案 0 :(得分:1)

我可以给你一个单行的Ruby解决方案,应该不是很难在Python中翻译它,但在VbScript中我更害怕。首先是通用搜索和替换版本。

ARGV[0..-3].each{|f| File.write(f, File.read(f).gsub(ARGV[-2],ARGV[-1]))}

将其保存在脚本中,例如replace.rb

使用

从命令行(此处为cmd.exe)开始
replace.rb *.txt <string_to_replace> <replacement>

细分,以便我可以解释发生了什么,但仍然可执行

# ARGV is an array of the arguments passed to the script.
ARGV[0..-3].each do |f| # enumerate the arguments of this script from the first to the last (-1) minus 2
  File.write(f,  # open the argument (= filename) for writing
    File.read(f) # open the argument (= filename) for reading
    .gsub(ARGV[-2],ARGV[-1])) # and replace all occurances of the beforelast with the last argument (string)
end

最后你要求用文件名替换ABC123。 当然经过测试和工作

ARGV[0..-1].each{|f| File.write(f, File.read(f).gsub('ABC123', f))}

执行

后我的一个测试文件(1.txt)的内容
test phrase
1.txt

修改

我看到你想在固定文件夹上进行子文件夹递归,没问题

Dir['**/*'].each{|f| File.write(f, File.read(f).gsub('ABC123', f)) unless File.directory?(f) }