ChatGPT解决这个技术问题 Extra ChatGPT

How to read file contents into a variable in a batch file?

This batch file releases a build from TEST to LIVE. I want to add a check constraint in this file that ensures there is an accomanying release document in a specific folder.

"C:\Program Files\Windows Resource Kits\Tools\robocopy.exe" "\\testserver\testapp$"        
"\\liveserver\liveapp$" *.* /E /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP
del "\\liveserver\liveapp$\web.config"
ren "\\liveserver\liveapp$\web.live.config" web.config

So I have a couple of questions about how to achieve this...

There is a version.txt file in the \\testserver\testapp$ folder, and the only contents of this file is the build number (for example, 45 - for build 45) How do I read the contents of the version.txt file into a variable in the batch file? How do I check if a file ,\\fileserver\myapp\releasedocs\ {build}.doc, exists using the variable from part 1 in place of {build}?


J
Joey

Read file contents into a variable:

for /f "delims=" %%x in (version.txt) do set Build=%%x

or

set /p Build=<version.txt

Both will act the same with only a single line in the file, for more lines the for variant will put the last line into the variable, while set /p will use the first.

Using the variable – just like any other environment variable – it is one, after all:

%Build%

So to check for existence:

if exist \\fileserver\myapp\releasedocs\%Build%.doc ...

Although it may well be that no UNC paths are allowed there. Can't test this right now but keep this in mind.


The set method only reads about 1024 characters, why is that?
Probably due to limits of a buffer within cmd. It's a horrible language for reliable scripts.
@IulianOnofrei, set /p calls cmd!ReadBufFromInput with a stack allocated buffer to read 1023 wide characters (2046 bytes). It reads 1023 bytes from the file, assuming 1 byte per OEM/ANSI character, but it decodes the file using the current codepage, which isn't necessarily OEM/ANSI. Worst case is codepage 65001 and a file filled with 4-byte UTF-8 characters (e.g. an ancient script). You'll get 255 characters, plus a partially decoded character stored as the replacement character, U+FFFD.
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") .... help for mentions this, by the way.
Both methods will read the contents of the file as it was when the script was last called, not the current content. It's not even the same as what type version.txt prints directly before this.
x
xnagyg

You can read multiple variables from file like this:

for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H

where param.txt:

PARAM1=value1
PARAM2=value2
...

this is the perfect solution. to literally answer the OP, (param.txt) should be (version.txt) and it should contain Build=45
This is the solution.
%%G was unexpected at this time.
@John: for use directly on command line, replace every %%G with %G
D
David

just do:

type version.txt

and it will be displayed as if you typed:

set /p Build=<version.txt
echo %Build%

@jeb i know that but im still grateful for the type command because thats what i needed
Thank you for providing the type version. Works exactly for what I need, accessing file contents that are on a shared directory.
M
Marc Dingena

To get all the lines of the file loaded into the variable, Delayed Expansion is needed, so do the following:

SETLOCAL EnableDelayedExpansion

for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x

There is a problem with some special characters, though especially ;, % and !


Enclosing the entire set expression within double-quotes could avoid problems with at least some special characters: set "Build=!Build!%%x".
My script just prints "echo is ON". Why is batch complete garbage?
Works for me without Delayed Expansion: set err= (next line) for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
Why is batch complete garbage? ...for consistency?
@TrevorHickey Make sure that delayed expansion is on for the whole scope of where you are dealing with the variable that holds the file contents