如何将文件内容读取到批处理文件中的变量中?


161

此批处理文件释放从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

所以我有几个关于如何实现这一目标的问题...

  1. version.txt文件\\testserver\testapp$夹中有一个文件,此文件的唯一内容是内部版本号(例如,对于45,对于内部版本45)如何将version.txt文件内容读入批处理文件中的变量中?

  2. 如何\\fileserver\myapp\releasedocs\ {build}.doc使用第1部分中的变量代替{build} 检查文件,是否存在?

Answers:


300

将文件内容读入变量:

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

要么

set /p Build=<version.txt

两者仅在文件中的一行中就可以起到相同的作用,对于更多行,for变体会将最后一行放入变量中,而set /p将使用第一行。

就像使用任何其他环境变量一样,使用变量毕竟是一个:

%Build%

因此,检查是否存在:

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

尽管很可能那里没有UNC路径。现在无法测试,但请记住这一点。


4
set方法仅读取约1024个字符,为什么呢?
Iulian Onofrei 2014年

12
可能是由于内的缓冲区限制所致cmd。对于可靠的脚本来说,这是一种可怕的语言。
2014年

我知道,我费了好几个小时才能替换文件中的字符串:|
Iulian Onofrei 2014年

16
@IulianOnofrei,使用堆栈分配的缓冲区进行set /p调用cmd!ReadBufFromInput以读取1023个宽字符(2046个字节)。假设每个OEM / ANSI字符为1个字节,它将从文件中读取1023个字节,但是它使用当前的代码页(不一定是OEM / ANSI)对文件进行解码。最糟糕的情况是代码页65001和一个充满4字节UTF-8字符(例如,古老的脚本)的文件。您将获得255个字符,再加上存储为替换字符U + FFFD的部分解码的字符。
Eryk Sun 2014年

3
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") ...help for顺便提一下。
乔伊,

46

您可以像这样从文件中读取多个变量:

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

其中param.txt:

PARAM1=value1
PARAM2=value2
...

1
这是完美的解决方案。从字面上回答OP,(param.txt)应该(version.txt)并且应该包含Build=45
robotik 2015年

这是解决方案。
JAIL

3
目前%% G是意外的。
约翰(John约翰)

4
@John:要直接在命令行上使用,请将其替换%%G%G
Stephan

32

做就是了:

type version.txt

它将显示为就像您键入:

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

4
@jeb我知道,但是我仍然感谢type命令,因为那就是我所需要的
MSM

感谢您提供类型版本。完全可以满足我的需要,可以访问共享目录中的文件内容。
Deliciousbrownies

22

要将文件的所有行都加载到变量中,需要延迟扩展,因此请执行以下操作:

SETLOCAL EnableDelayedExpansion

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

有一些特殊字符的问题,虽然特别;%!


将整个set表达式用双引号引起来可以避免出现至少一些特殊字符的问题:set "Build=!Build!%%x"
aschipfl 2015年

9
我的脚本仅显示“ echo is ON”。为什么批量完成垃圾?
Trevor Hickey

为我工作而没有延迟扩展:( set err=下一行)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
tivnet

2
为什么批量完成垃圾?...为了一致性?
Jan Nielsen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.