我在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行没有takken,而对应的变量第2行、第3行为空?
如果test.txt
包含Unix换行符0x0A
,我可以重现您的问题,如果它包含windows换行符(0x0D 0x0A
),它也可以工作。因此,如果这也是问题的根源,请转换test.txt
中的换行符。
您可以使用FOR/f循环:
@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%
稍微扩展一下wero的答案。解决方案实际上是确保文件中的所有行都以CRLF(\r\n)或LFCR(\n\r)结尾。下面的讨论解释了原因。
SET/p行为并不完全是直观的。以下行为描述摘自DosTips线程http://www.dostips.com/forum/viewtopic.php?t=2160.
读取字符:
从输入流中读取字符并将其放入字符缓冲区,直到三个条件之一成立:
- 条件1:最后2个读取字符是CRLF或LFCR。(一整行)
- 条件2:字符缓冲区中有1023个字符。(缓冲器满)
- 条件3:超时,通常是由流结束引起的。(超时错误条件)注意-不确定是否真的存在超时条件,陪审团对此仍不确定
处理字符缓冲区:
- 字符缓冲区末尾的所有控制字符都将被丢弃(可能的数据丢失)
- 如果char缓冲区中有一个NUL字符,则所有字符缓冲区中第一个NUL后面的字符将是丢弃(数据丢失)
从字符缓冲区移动到变量。
- 如果字符缓冲区为空,则报告错误条件:…将errorlevel设置为1(表示未输入值)
- 如果charbuffer不为空:…将字符串从字符缓冲区移动到set/p命令中命名的变量
SET/p完成并将控制权返回给批处理文件。
注意,可以可靠处理的最长行是1021字节(不包括终止CRLF或LFCR)。