Write batch variable into specific line in a text file

前端 未结 3 1215
渐次进展
渐次进展 2020-12-20 08:08

I have a batch file where I need to write a variable into a specific line of a text file and override what is all ready in that line. I have the code to read specific lines

相关标签:
3条回答
  • 2020-12-20 08:33

    I figured it out!! Here is the code for anyone else who might ever need it.

    @echo off
    setlocal enableextensions enabledelayedexpansion
    
    set inputfile=variables.txt
    
    set tempfile=%random%-%random%.tmp
    
    copy /y nul %tempfile%
    
    set line=0
    
    for /f "delims=" %%l in (%inputfile%) do (
        set /a line+=1
        if !line!==4 (
            echo WORDS YOU REPLACE IT WITH>>%tempfile%
        ) else (
            echo %%l>>%tempfile%
        )
    )
    
    del %inputfile%
    ren %tempfile% %inputfile%
    
    endlocal
    
    0 讨论(0)
  • 2020-12-20 08:33

    Not absolutely sure I've understood everything correctly, but if you want to substitute something for an existing part of a text file with a batch script, you'll need to write everything (including the changed part) to a new file first, then delete the original and rename the new file to the original name.

    I can't really see a point of reading everything into variables, unless I'm missing something. You could simply iterate over the lines writing them one by one into the new file and replacing the specific line's contents with the substitute text along the way:

    setLocal EnableDelayedExpansion
    >newFile.txt (
      for /f "tokens=* delims= " %%a in (variables.txt) do (
        set /a N+=1
        if !N! == 4 (ECHO substitute text) ELSE ECHO %%a
      )
    )
    del variables.txt
    rename newFile.txt variables.txt
    

    If the substitute text must, in turn, be derived from one of the lines, you could do something like this:

    setLocal EnableDelayedExpansion
    >newFile.txt (
      for /f "tokens=* delims= " %%a in (variables.txt) do (
        set /a N+=1
        if !N! == 1 SET subst_text=%%a
        if !N! == 4 (ECHO !subst_text!) ELSE ECHO %%a
      )
    )
    del variables.txt
    rename newFile.txt variables.txt
    
    0 讨论(0)
  • 2020-12-20 08:50

    Another option might be to overwrite the file entirely. Here's the part to do that:

    :saveVars
    (
    ECHO %v1%
    ECHO %v2%
    ECHO %v3%
    ECHO %v4%
    ECHO %v5%
    ) >variables.txt
    GOTO :EOF
    

    That is, if the number of lines is fixed and known beforehand. If not, you might want to store the last value of the increment in your example code and, when saving the variables, use it like this:

    :saveVars
    SETLOCAL EnableDelayedExpansion
    (
      FOR /L %%i IN (1,1,%N%) DO (ECHO !v%%i!)
    ) >variables.txt
    ENDLOCAL
    GOTO :EOF
    

    I'm assuming here that the v1/v2 etc. variables would be used only for synchronising with the file: when it is read, the lines are stored in those variables, and when any of them (variables) gets changed, you just call the saveVars subroutine immediately. Here's an example how you would use it:

    …
    SET v2=something
    CALL :saveVars
    …
    SET v4=%somevar%
    CALL :saveVars
    …
    

    If the file is small, the rewriting should be fast enough.

    0 讨论(0)
提交回复
热议问题