0

I now have the following bat file working (which allows one to add text to the end of each line of a file) -- please see also: bat file: Use of if, for and a variable all together

@echo off
setLocal EnableDelayedExpansion

IF EXIST "%FileToModify1%"  (
  for /f "tokens=* delims= " %%a in (%FileToModify1%) do (
    echo %%a   Note:  certain conditions apply  >> "%SaveFile1%"
  ) 
)

However, I would like to save each line to a variable (including the new line symbol(s)) and then echo the variable to a file at the end. Since there are several lines in the file it is really inefficient to save to a file with each line.

I tried googling this, but the answers do not fit my situation...

essentially I need the syntax for concatenating and saving to a variable (cumulatively like "+=" in C#), and also using the new lines...

2 Answers 2

2

Actually you do not need to put everything into a variable, you just need to place the redirection at another position. Try this:

@echo off
setlocal EnableDelayedExpansion

if exist "%FileToModify1%" (
    for /F "usebackq delims=" %%a in ("%FileToModify1%") do (
        echo %%a   Note:  certain conditions apply
    )
) > "%SaveFile1%"

endlocal

Note that empty lines in the original file are ignored by for /F, so they are not transferred to the new file. Also lines starting with ; are ignored by for /F (unless you change the eol option -- see for /?).

I modified the for /F options:

  • no delims are allowed, so the each line is output as is (with "tokens=* delims= ", leading spaces are removed from each line if present);
  • usebackq allows to surround the file specification in "" which is helpful if it contains spaces;

Appendix A

If you still want to store the file content into a variable, you can do this:

@echo off
setlocal EnableDelayedExpansion

rem the two empty lines after the following command are mandatory:
set LF=^


if exist "%FileToModify1%" (
    set "FileContent="
    for /F "usebackq delims=" %%a in ("%FileToModify1%") do (
        set "FileContent=!FileContent!%%a   Note:  certain conditions apply!LF!"
    )
    (echo !FileContent!) > "%SaveFile1%"
)

endlocal

The file content is stored in variable FileContent, including the appendix Note: certain conditions apply. LF holds the new-line symbol.

Note:
The length of a variable is very limited (as far as I know, 8191 bytes since Windows XP and 2047 bytes earlier)!

[References:
Store file output into variable (last code fragment);
Explain how dos-batch newline variable hack works]


Appendix B

Alternatively, you could store the file content in a array, like this:

@echo off
setlocal EnableDelayedExpansion

if exist "%FileToModify1%" (
    set /A cnt=0
    for /F "usebackq delims=" %%a in ("%FileToModify1%") do (
        set /A cnt+=1
        set "Line[!cnt!]=%%a   Note:  certain conditions apply"
    )

    (for /L %%i in (1,1,!cnt!) do (
        echo !Line[%%i]!
    )) > "%SaveFile1%"
)

endlocal

Each line of the file is stored in an array Line[1], Line[2], Line[3], etc., including the appendix Note: certain conditions apply. cnt contains the total number of lines, which is the array size.

Note:
Actually this is not a true array data type as such does not exist in batch, it is a collection of scalar variables with an array-style naming (Line[1], Line[2],...); therefore one might call it pseudo-array.

[References:
Store file output into variable (first code fragment);
How to create an array from txt file within a batch file?]

Sign up to request clarification or add additional context in comments.

2 Comments

while this answer is nice, accepted, and probably better than saving to a variable, if anyone know how to do that it may help others who come here.....
I edited my answer and added my former (deleted) comments as Appendices including code snippets and references; I hope it is useful...
1

you can write the output file in one shot:

(
  for /l %%i in (0,1,10) do (
   echo line %%i
  )
)>outfile.txt

(much quicker than appending each line separately)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.