如何将文件内容读入批处理文件中的变量?
Posted
技术标签:
【中文标题】如何将文件内容读入批处理文件中的变量?【英文标题】:How to read file contents into a variable in a batch file? 【发布时间】:2011-03-05 09:05:46 【问题描述】:此批处理文件将构建从 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 - 用于内部版本 45)
如何将version.txt
文件的内容读入批处理文件中的变量?
如何使用第 1 部分中的变量代替 build 检查文件\\fileserver\myapp\releasedocs\ build.doc
是否存在?
【问题讨论】:
【参考方案1】:将文件内容读入变量:
for /f "delims=" %%x in (version.txt) do set Build=%%x
或
set /p Build=<version.txt
两者的作用相同,文件中只有一行,对于更多行,for
变体会将 last 行放入变量中,而 set /p
将使用 首先。
使用变量——就像任何其他环境变量一样——毕竟它是一个:
%Build%
所以要检查是否存在:
if exist \\fileserver\myapp\releasedocs\%Build%.doc ...
虽然很可能那里不允许使用 UNC 路径。目前无法对此进行测试,但请记住这一点。
【讨论】:
set
方法只能读取大约 1024 个字符,这是为什么呢?
可能是由于cmd
内的缓冲区限制。对于可靠的脚本来说,这是一种可怕的语言。
我知道,我努力了好几个小时来替换文件中的字符串:|
@IulianOnofrei, set /p
使用堆栈分配的缓冲区调用 cmd!ReadBufFromInput
以读取 1023 个宽字符(2046 字节)。它从文件中读取 1023 个字节,假设每个 OEM/ANSI 字符 1 个字节,但它使用当前代码页(不一定是 OEM/ANSI)对文件进行解码。最坏的情况是代码页 65001 和一个用 4 字节 UTF-8 字符填充的文件(例如一个古老的脚本)。您将获得 255 个字符,以及存储为替换字符 U+FFFD 的部分解码字符。
@Jan: for /f "usebackq" %%x in ("path with spaces.txt") ...
。顺便说一句,help for
提到了这一点。【参考方案2】:
您可以像这样从文件中读取多个变量:
for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H
param.txt:
PARAM1=value1
PARAM2=value2
...
【讨论】:
这是完美的解决方案。从字面上回答 OP,(param.txt)
应该是 (version.txt)
并且它应该包含 Build=45
这是解决方案。
%%G 此时出乎意料。
@John:为了直接在命令行上使用,将每个%%G
替换为%G
【参考方案3】:
只是做:
type version.txt
它会像你输入的一样显示:
set /p Build=<version.txt
echo %Build%
【讨论】:
@jeb 我知道,但我仍然感谢 type 命令,因为这正是我所需要的 感谢您提供类型版本。完全满足我的需要,访问共享目录上的文件内容。【参考方案4】:要将文件的所有行加载到变量中,需要延迟扩展,因此请执行以下操作:
SETLOCAL EnableDelayedExpansion
for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x
一些特殊字符存在问题,尤其是;
、%
和!
【讨论】:
将整个set
表达式用双引号括起来可以避免至少有一些 个特殊字符出现问题:set "Build=!Build!%%x"
。
我的脚本只打印“echo is ON”。为什么批量完全是垃圾?
为我工作,无需延迟扩展:set err=
(下一行)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
为什么批处理是完全垃圾? ...为了一致性?
@TrevorHickey 确保在处理保存文件内容的变量的整个范围内都启用延迟扩展以上是关于如何将文件内容读入批处理文件中的变量?的主要内容,如果未能解决你的问题,请参考以下文章