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}?
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.
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
...
(param.txt)
should be (version.txt)
and it should contain Build=45
%%G
with %G
just do:
type version.txt
and it will be displayed as if you typed:
set /p Build=<version.txt
echo %Build%
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 !
set
expression within double-quotes could avoid problems with at least some special characters: set "Build=!Build!%%x"
.
set err=
(next line) for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
Success story sharing
set
method only reads about 1024 characters, why is that?cmd
. It's a horrible language for reliable scripts.set /p
callscmd!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.for /f "usebackq" %%x in ("path with spaces.txt") ...
.help for
mentions this, by the way.type version.txt
prints directly before this.