Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Write batch variable into specific line in a text file

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 from the file maybe I could switch it around to also write?

Reading lines code:

setLocal EnableDelayedExpansion
for /f "tokens=* delims= " %%a in (variables.txt) do (
set /a N+=1
set v!N!=%%a
)
set variable1=!v1!
set variable2=!v2!
set variable3=!v3!
set variable4=!v4!

I've tried to add echo %variable1% > !v4! something like that but it doesn't work.

like image 298
Spencer May Avatar asked Nov 20 '25 17:11

Spencer May


2 Answers

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
like image 53
Spencer May Avatar answered Nov 23 '25 17:11

Spencer May


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.

like image 40
Andriy M Avatar answered Nov 23 '25 19:11

Andriy M



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!