1. Computer problem? Tech Support Guy is completely free -- paid for by advertisers and donations. Click here to join today! If you're new to Tech Support Guy, we highly recommend that you visit our Guide for New Members.

Reading a text file, eiditing a certain line, then saving.

Discussion in 'Software Development' started by tommo020788, Dec 26, 2010.

Thread Status:
Not open for further replies.
  1. tommo020788

    tommo020788 Thread Starter

    Joined:
    Oct 20, 2008
    Messages:
    322
    Hi, I need a batch file that can read a vbs file, and edit a certain line out of it.
    Example: The batch file needs to read, and search the vbs file "regearch.vbs" for the line "tomkey", then change it to, "tomkey2", then save the vbs file again.

    Heres the reg file coding:
    Code:
    ' Script that will do a substring search in all key names
    ' for the string in the variable sKey and delete the key
    ' if the string is found.
    '
    ' You can set a key path in the variable sStartKeyPathx if
    ' you want to limit the search to a specific registry branch.
    ' Adjust callouts to sStartKeyPath1/2/3 as you see fit
    
    Const OpenAsASCII      =  0
    Const FailIfNotExist   =  0
    Const ForReading       =  1
    Const OverwriteIfExist = -1
    
    sStartKeyPath1 =  "HKEY_CURRENT_USER"
    sStartKeyPath2 =  "HKEY_LOCAL_MACHINE"
    sStartKeyPath3 =  "HKEY_USERS"
    
    sKey = "tomkey"
    
    Set oShell = CreateObject("WScript.Shell")
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    
    ' get a temporary registry file name
    sTempFile = oFSO.GetSpecialFolder(2).ShortPath & "\" & oFSO.GetTempName
    
    sStart = Now
    ExportRegistry sStartKeyPath1, sTempFile
    CreateAndRunRegistryFile sKey, sTempFile
    
    ExportRegistry sStartKeyPath2, sTempFile
    CreateAndRunRegistryFile sKey, sTempFile
    
    ExportRegistry sStartKeyPath3, sTempFile
    CreateAndRunRegistryFile sKey, sTempFile
    
    ' delete temp file
    If oFSO.FileExists(sTempFile) Then
      oFSO.DeleteFile sTempFile
    End If
    
    finFile = "C:\finishedreg.txt"
    Set completionFile = oFSO.CreateTextFile(finFile, _
    OverwriteIfExist, OpenAsASCII)
    completionFile.WriteLine "Finished in " & DateDiff("n", sStart, Now) & " minutes"
    completionFile.Close 
    
    Sub ExportRegistry(sStartKey, sFile)
      If Trim(sKey) = "" Then
        ' export the complete registry
        sCmd = "regedit.exe /S /E:A """ & sFile & """"
      Else
        ' export the registry key to a file
        sCmd = "regedit.exe /S /E:A """ & sFile & """ " & """" & sStartKey & """"
      End If
      oShell.Run sCmd, 0, True
    End Sub
    
    Sub CreateAndRunRegistryFile(sString, sInFile)
    
      sOutFile = oFSO.GetSpecialFolder(2).ShortPath & "\" & oFSO.GetTempName
    
      ' find all string starting with [ and ends with ], and that
      ' also contains at least one bachslash in addition to the
      ' text in the variable sString
      sCmd = "%comspec% /c findstr.exe " _
           & "/i /r ""^\[.*\\.*" & sString & ".*\]$"" """ _
           & sInFile & """ >""" & sOutFile & """"
    
      oShell.Run sCmd, 0, True
    
      Set fFile = oFSO.OpenTextFile(sOutFile, ForReading, _
                                        FailIfNotExist, OpenAsASCII)
    
      sResult = ""
      On Error Resume Next
      sResult = fFile.ReadAll
      fFile.Close
      oFSO.DeleteFile sOutFile
      On Error Goto 0
    
      If sResult <> "" Then
    
        Set fRegFile = oFSO.CreateTextFile(sOutFile, _
                        OverwriteIfExist, OpenAsASCII)
        fRegFile.WriteLine "REGEDIT4" & vbCrLf
    
        aResult = Split(sResult, vbCrLf)
    
        For i = 0 To UBound(aResult)
    
          sLine = aResult(i)
    
          ' do the same tests as the regexp in findstr just in case.
          If InStr(1, sLine, sString, vbTextCompare) > 0 _
                      And Left(sLine, 1) = "[" And Right(sLine, 1) = "]" Then
    
          sLine = "[-" & Mid(sLine, 2)
            fRegFile.WriteLine sLine
          End If
        Next
    
        fRegFile.WriteLine vbCrLf   ' add two blank lines at the end
        fRegFile.Close
        sCmd = "regedit.exe /s """ & sOutFile & """"
        oShell.Run sCmd, 0, True
    
      End If
    
      If oFSO.FileExists(sOutFile) Then
        oFSO.DeleteFile sOutFile
      End If
    
    End Sub 
    Any ideas?
     
  2. TheOutcaste

    TheOutcaste

    Joined:
    Aug 7, 2007
    Messages:
    9,028
    Seems like a lot of work to just change one line considering everytime you want to change it you have to edit the file that does the changing, or type the filename, search and replace strings on the command line. Easier to just edit the file directly. That's the whole point of using variables, so you only need to change one line.

    If you are calling this script from another file, be easier to just modify it to use a passed variable, then you don't need to edit it.
    Just change this line:
    sKey = "tomkey2"
    to this:
    sKey = Wscript.Arguments.Item(0)

    Then call it like this:
    cscript /nologo regearch.vbs SearchForMe

    You'd want to check that a value was actually passed, or you'll get an error.

    Easier to do this kind of editing with a VBScript.
    Code:
    Const ForReading = 1
    Const ForWriting = 2
    strFile = Wscript.Arguments.Item(0)
    strSearch = Wscript.Arguments.Item(1)
    strReplace = Wscript.Arguments.Item(2)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(StrFile, ForReading)
    strText = objFile.ReadAll
    objFile.Close
    strNewText = Replace(strText, strSearch, strReplace,1,-1,1)
    Set objFile = objFSO.OpenTextFile(StrFile, ForWriting)
    objFile.WriteLine strNewText
    objFile.Close
    
    Save it as SearchandReplace.vbs
    Call it like this:
    cscript /nologo SearchandReplace.vbs FilenametoSearch StringtoSearchfor ReplaceWithThis

    If you want it as a batch file:
    Code:
    @Echo Off
    Set _File=C:\Temp dir\Test\Test.vbs
    Set _Search=tomkey
    Set _Replace=tomkey2
    Set _VBTemp=%temp%\tmp.vbs
    (Echo.Const ForReading = 1
    Echo.Const ForWriting = 2
    Echo.strFile = Wscript.Arguments.Item^(0^)
    Echo.strSearch = Wscript.Arguments.Item^(1^)
    Echo.strReplace = Wscript.Arguments.Item^(2^)
    Echo.Set objFSO = CreateObject^("Scripting.FileSystemObject"^)
    Echo.Set objFile = objFSO.OpenTextFile^(StrFile, ForReading^)
    Echo.strText = objFile.ReadAll
    Echo.objFile.Close
    Echo.strNewText = Replace^(strText, strSearch, strReplace,1,-1,1^)
    Echo.Set objFile = objFSO.OpenTextFile^(StrFile, ForWriting^)
    Echo.objFile.WriteLine strNewText
    Echo.objFile.Close)>"%_VBTemp%"
    cscript /nologo "%_VBTemp%" "%_File%" "%_Search%" "%_Replace%"
    Del "%_VBTemp%"
    Edit the set lines as needed, or convert it to use parameters.
     
As Seen On
As Seen On...

Welcome to Tech Support Guy!

Are you looking for the solution to your computer problem? Join our site today to ask your question. This site is completely free -- paid for by advertisers and donations.

If you're not already familiar with forums, watch our Welcome Guide to get started.

Join over 733,556 other people just like you!

Thread Status:
Not open for further replies.

Short URL to this thread: https://techguy.org/970828

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice