使用VBScript在我的文本中查找和替换字符串

7
我正在寻找一段VBScript,可以在文件(例如1.txt 2.xml)中进行搜索和替换操作。 我有一个名为“1.txt”的文件,其中包含单词“temporary”,我想将其更改为“permanent”。 因为我经常得到这个文件,所以我需要一个脚本来实现这个功能。
每次我尝试编写一个包含打开txt文件和replace命令的脚本时,它都无法正常工作。
我找到了一段脚本,可以使用另一个文件对此文件进行更改,但这不是我要找的东西。

惯例上,我们会将正确答案的提供者标记为被接受的答案,并感谢他们。 - Tester101
我已经使用扩展名为.config的文件测试了脚本,其中包含您在评论中提供的示例文本,并且没有出现任何问题。我不确定您如何使用该脚本,但是在“”的情况下,当您在命令行中键入命令时,请勿包括“”,只需键入Find_And_Replace.vbs "C:\1.txt" "temporary" "permanent",而不是Find_And_Replace.vbs "C:\1.txt" ""temporary"" "permanent"。 - Tester101
你也可以尝试更改FindAndReplace函数中的第一行代码 "Set inputFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFilename, 1)" 为 "Set inputFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFilename, 1,true,0)"。如果这不起作用,请尝试将此行代码 "outputFile.Write Replace(strInputFile, strFind, strReplace)" 更改为 "outputFile.Write Replace(strInputFile, strFind, strReplace,1,-1,1)"。 - Tester101
请记住,Replace函数返回替换后的文本,它不会修改传递给它的变量。 - brianary
2个回答

7

试试这个

If WScript.Arguments.Count <> 3 then
  WScript.Echo "usage: Find_And_replace.vbs filename word_to_find replace_with "
  WScript.Quit
end If

FindAndReplace WScript.Arguments.Item(0), WScript.Arguments.Item(1), WScript.Arguments.Item(2)
WScript.Echo "Operation Complete"

function FindAndReplace(strFilename, strFind, strReplace)
    Set inputFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFilename, 1)
    strInputFile = inputFile.ReadAll
    inputFile.Close
    Set inputFile = Nothing
    Set outputFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFilename,2,true)
    outputFile.Write Replace(strInputFile, strFind, strReplace)
    outputFile.Close
    Set outputFile = Nothing
end function 

把这段代码保存在名为Find_And_Replace.vbs的文件中,然后可以在命令行中像这样使用。
[C:\]> Find_And_Replace.vbs "C:\1.txt" "temporary" "permanent"

*这种方法区分大小写,"This" != "this"。

如果您不想将整个文件读入内存,可以使用类似以下方式的临时文件。

If WScript.Arguments.Count <> 3 then
  WScript.Echo "usage: Find_And_replace.vbs filename word_to_find replace_with "
  WScript.Quit
end If

FindAndReplace WScript.Arguments.Item(0), WScript.Arguments.Item(1), WScript.Arguments.Item(2)
WScript.Echo "Operation Complete"

function FindAndReplace(strFile, strFind, strReplace)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objInputFile = objFSO.OpenTextFile(strFile,1)
    strTempDir = objFSO.GetSpecialFolder(2)
    Set objTempFile = objFSO.OpenTextFile(strTempDir & "\temp.txt",2,true)
    do until objInputFile.AtEndOfStream
        objTempFile.WriteLine(Replace(objInputFile.ReadLine, strFind, strReplace))
    loop
    objInputFile.Close
    Set objInputFile = Nothing
    objTempFile.Close
    Set objTempFile = Nothing
    objFSO.DeleteFile strFile, true
    objFSO.MoveFile strTempDir & "\temp.txt", strFile
    Set objFSO = Nothing
end function 

非常感谢,这非常美丽和有创意,正是我所寻找的。 新年快乐。 - Tzahi
你好, 我有时候在脚本中遇到问题,我遇到问题的文件包含 "",在我尝试替换的单词之前的文件中(例如 "this flight number is "temporary""),以及以 .config 结尾的文件。 我没有收到任何错误提示(操作完成),所以很难知道问题出在哪里。 有什么想法为什么会这样或者如何解决吗? 谢谢。 - Tzahi

2
您可以尝试这个版本,它不会将整个文件读入内存中:
Set objFS = CreateObject("Scripting.FileSystemObject")
strFile=WScript.Arguments.Item(0)
strOld=WScript.Arguments.Item(1)
strNew=WScript.Arguments.Item(2)
Set objFile = objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfStream
 strLine = objFile.ReadLine 
        if Instr(strLine,strOld)> 0 Then
          strLine=Replace(strLine,strOld,strNew)
        End If
 WScript.Echo strLine
Loop

使用方法:

c:\test> cscript //nologo find_replace.vbs file oldtext newtext

这不会改变文件。我“ slurp”整个文件到内存中的原因是为了能够将更改写回到同一文件中。 - Tester101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接