ChatGPT解决这个技术问题 Extra ChatGPT

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

此批处理文件将构建从 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 是否存在?


J
Joey

将文件内容读入变量:

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 路径。现在无法测试,但请记住这一点。


set 方法只能读取大约 1024 个字符,这是为什么呢?
可能是由于 cmd 内的缓冲区限制。对于可靠的脚本来说,这是一种可怕的语言。
@IulianOnofrei,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 在此之前直接打印 的内容不同。
x
xnagyg

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

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
D
David

做就是了:

type version.txt

它会像您输入的一样显示:

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

@jeb 我知道,但我仍然感谢 type 命令,因为这就是我需要的
感谢您提供类型版本。完全满足我的需要,访问共享目录上的文件内容。
M
Marc Dingena

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

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