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

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 确保在处理保存文件内容的变量的整个范围内都启用延迟扩展

以上是关于如何将文件内容读入批处理文件中的变量?的主要内容,如果未能解决你的问题,请参考以下文章

perl处理fasta文件

如何仅使用批处理文件中的变量提取字符串的一部分?

Sqlplus可以将文件内容读入变量吗?

shell的for while读取文件写法和区别

将变量内容回显到文本文件中的批处理脚本[重复]

删除大文件中的一行内容