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

use*_*345 145 batch-file

此批处理文件将构建从TEST释放到LIVE.我想在此文件中添加一个检查约束,以确保在特定文件夹中存在一个accomanying发布文档.

"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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Joe*_*oey 274

将文件内容读入变量:

for /f "delims=" %%x in (version.txt) do set Build=%%x
Run Code Online (Sandbox Code Playgroud)

要么

set /p Build=<version.txt
Run Code Online (Sandbox Code Playgroud)

两者都将在文件中只有一行的情况下相同,对于更多行,for变量将最后一行放入变量,而set /p将使用第一行.

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

%Build%
Run Code Online (Sandbox Code Playgroud)

所以要检查是否存在:

if exist \\fileserver\myapp\releasedocs\%Build%.doc ...
Run Code Online (Sandbox Code Playgroud)

虽然很可能在那里不允许UNC路径.现在无法测试,但请记住这一点.

  • @IulianOnofrei,`set/p`调用`cmd!ReadBufFromInput`,堆栈分配缓冲区读取1023个宽字符(2046字节).它从文件中读取1023个字节,假设每个OEM/ANSI字符为1个字节,但它使用当前代码页解码文件,该代码页不一定是OEM/ANSI.最坏的情况是代码页65001和填充有4字节UTF-8字符的文件(例如古代脚本).您将获得255个字符,以及存储为替换字符的部分解码字符U + FFFD. (14认同)
  • 可能是由于`cmd`内的缓冲区限制.对于可靠的脚本来说,这是一种可怕的语言. (11认同)
  • `set` 方法只能读取大约 1024 个字符,这是为什么呢? (5认同)
  • @Jan:`for/f"usebackq"%% x in("path with spaces.txt")...`.顺便提一句,"帮助"提到了这一点. (3认同)
  • 这两种方法都会读取*上次*调用脚本时的文件内容,而不是当前内容。它甚至与“type version.txt”*直接在此之前*打印的内容不同。 (2认同)

xna*_*gyg 42

您可以从文件中读取多个变量,如下所示:

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

其中param.txt:

PARAM1=value1
PARAM2=value2
...
Run Code Online (Sandbox Code Playgroud)

  • %% G此时出人意料. (3认同)
  • 这是完美的解决方案。从字面上回答 OP,`(param.txt)` 应该是 `(version.txt)` 并且它应该包含 `Build=45` (2认同)
  • @John:直接在命令行上使用,用'%G`替换每个'%% G` (2认同)

Dav*_*vid 27

做就是了:

type version.txt
Run Code Online (Sandbox Code Playgroud)

它将显示为您输入的内容:

set /p Build=<version.txt
echo %Build%
Run Code Online (Sandbox Code Playgroud)

  • @jeb我知道,但我仍然感激类型命令,因为这就是我需要的 (4认同)

小智 19

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

SETLOCAL EnableDelayedExpansion

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

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

  • 我的脚本只打印"echo is ON".为什么批次完全垃圾? (8认同)
  • 将整个 `set` 表达式括在双引号内可以避免至少_一些_特殊字符的问题:`set "Build=!Build!%%x"`。 (2认同)
  • _为什么批处理完全是垃圾?_ ...为了一致性? (2认同)