此批处理文件将构建从 TEST 发布到 LIVE。我想在这个文件中添加一个检查约束,以确保在特定文件夹中有一个随附的发布文档。
"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
所以我有几个关于如何实现这一目标的问题......
\\testserver\testapp$ 文件夹中有一个 version.txt 文件,这个文件的唯一内容是内部版本号(例如,45 - for build 45) 如何读取 version.txt 文件的内容到批处理文件中的变量?如何使用第 1 部分中的变量代替 {build} 检查文件 \\fileserver\myapp\releasedocs\ {build}.doc 是否存在?
将文件内容读入变量:
for /f "delims=" %%x in (version.txt) do set Build=%%x
或者
set /p Build=<version.txt
两者的作用相同,文件中只有一行,对于更多行,for
变体会将 last 行放入变量中,而 set /p
将使用 first。
使用变量——就像任何其他环境变量一样——毕竟它是一个:
%Build%
所以要检查是否存在:
if exist \\fileserver\myapp\releasedocs\%Build%.doc ...
尽管很可能那里不允许使用 UNC 路径。现在无法测试,但请记住这一点。
您可以像这样从文件中读取多个变量:
for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H
其中param.txt:
PARAM1=value1
PARAM2=value2
...
(param.txt)
应该是 (version.txt)
并且它应该包含 Build=45
%%G
替换为 %G
做就是了:
type version.txt
它会像您输入的一样显示:
set /p Build=<version.txt
echo %Build%
要将文件的所有行加载到变量中,需要延迟扩展,因此请执行以下操作:
SETLOCAL EnableDelayedExpansion
for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x
某些特殊字符存在问题,尤其是 ;
、%
和 !
set
表达式用双引号括起来可以避免至少有 一些 个特殊字符出现问题:set "Build=!Build!%%x"
。
set err=
(下一行)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
set
方法只能读取大约 1024 个字符,这是为什么呢?cmd
内的缓冲区限制。对于可靠的脚本来说,这是一种可怕的语言。set /p
使用堆栈分配的缓冲区调用cmd!ReadBufFromInput
以读取 1023 个宽字符(2046 个字节)。它从文件中读取 1023 个字节,假设每个 OEM/ANSI 字符 1 个字节,但它使用当前代码页(不一定是 OEM/ANSI)对文件进行解码。最坏的情况是代码页 65001 和一个用 4 字节 UTF-8 字符填充的文件(例如一个古老的脚本)。您将获得 255 个字符,以及存储为替换字符 U+FFFD 的部分解码字符。for /f "usebackq" %%x in ("path with spaces.txt") ...
。顺便说一句,help for
提到了这一点。type version.txt
在此之前直接打印 的内容不同。