我在Windows批处理编程中遇到一个非常简单的问题,但我没有在现有问题中找到答案。
我想用文本文件中的输入填充3个变量的内容(3行,每个变量一个),并使用set /p
。但似乎这只适用于第一行,而不适用于其他行。
这是一个可重复的例子:
我启动了这个批处理文件(test.bat):
@echo off
(
set /p Line1=
set /p Line2=
set /p Line3=
)<%1
echo I read the following parameter from your %1 config file:
echo -- Content of line 1: %Line1%
echo -- Content of line 2: %Line2%
echo -- Content of line 3: %Line3%
参数文件是test.txt:
The line 1
The line 2
The line 2 copied
然后,我只是启动'test.bat test.txt'
,结果如下:
我从test.txt配置文件中读取了以下参数:
-- Content of line 1: The line 1
-- Content of line 2:
-- Content of line 3:
为什么test.txt中的第2行和第3行没有被释放,相应的变量line2和line3为空?
答案 0 :(得分:3)
如果test.txt
包含Unix换行符0x0A
,我可以重现您的问题,如果它包含Windows换行符(0x0D 0x0A
),则可以正常运行。因此,如果这也是您问题的根源,请转换test.txt
。
答案 1 :(得分:0)
You could use a FOR /f loop:
@echo off
setlocal
setlocal EnableDelayedExpansion
set "linenum=1"
for /f %%i in (%1) do (
set "line!linenum!=%%i"
set /a "linenum = !linenum! + 1"
)
echo %line1%
echo %line2%
echo %line3%
答案 2 :(得分:0)
稍微扩展wero's answer。解决方案确实是为了确保文件中的所有行都以CRLF(\ r \ n)或LFCR(\ n \ r)结尾。下面的讨论解释了原因。
SET / P行为并不完全直观。以下行为描述取自http://www.dostips.com/forum/viewtopic.php?t=2160的DosTips主题。
阅读字符
从输入流中读取字符并将其放入字符缓冲区,直到三个条件之一为真:
处理char缓冲区:
从char缓冲区移动到Var。
完成SET / P并将控制权返回给批处理文件。
请注意,可以可靠处理的最长行是1021个字节(不包括终止CRLF或LFCR)。