Tuesday, February 8, 2011

How can I load the contents of a text file into a batch file variable?

I need to be able to load the entire contents of a text file and load it into a variable for further processing.

How can I do that?

Here's what I did thanks to Roman Odaisky's answer.

SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (test.txt) do set content=!content! %%i

echo %content%
EndLocal
  • I know this isn't helpful, but you might want to consider abandoning batch files for what you're doing. A coworker of mine is absolutely in love with PowerShell. I've had friends use Python for everything you can think of.

  • Use for, something along the lines of:

    set content=
    for /f "delims=" %%i in ('filename') do set content=%content% %%i
    

    Maybe you’ll have to do setlocal enabledelayedexpansion and/or use !content! rather than %content%. I can’t test, as I don’t have any MS Windows nearby (and I wish you the same :-).

    The best batch-file-black-magic-reference I know of is at http://www.rsdn.ru/article/winshell/batanyca.xml. If you don’t know Russian, you still could make some use of the code snippets provided.

  • Create a file called "SetFile.bat" that contains the following line with no carriage return at the end of it...

    set FileContents=
    

    Then in your batch file do something like this...

       @echo off
       copy SetFile.bat + %1 $tmp$.bat > nul
       call $tmp$.bat
       del $tmp$.bat
    

    %1 is the name of your input file and %FileContents% will contain the contents of the input file after the call. This will only work on a one line file though (i.e. a file containing no carriage returns). You could strip out/replace carriage returns from the file before calling the %tmp%.bat if needed.

    From pdavis
  • Can you define further processing?

    You can use a for loop to almost do this, but there's no easy way to insert CR/LF into an environment variable, so you'll have everything in one line. (you may be able to work around this depending on what you need to do.)

    You're also limited to less than about 8k text files this way. (You can't create a single env var bigger than around 8k.)

    Bill's suggestion of a for loop is probably what you need. You process the file one line at a time:

    (use %i at a command line %%i in a batch file) for /f "tokens=1 delims=" %%i in (file.txt) do echo %%i

    more advanced:

    for /f "tokens=1 delims=" %%i in (file.txt) do call :part2 %%i goto :fin

    :part2 echo %1 ::do further processing here goto :eof

    :fin

  • You can use:

    set content=
    for /f "delims=" %%i in ('type text.txt') do set content=!content! %%i
    
    From Curro
  • You might benefit (either directly and immediately or indirectly and at a later time) by reading this page (it's a VERY easy read. clear and concise).

    Getting File Data into an Environment Variable (env var)

    I was able to have success with "method 4b", which gives me hope that I will eventually have success with 4a. I think "method 4a" is cool and would be ideal for me, but I haven't managed to get the creation of "prefix.dat" correct yet as the tutorial describes.

    From que que

0 comments:

Post a Comment