输入文件中的set / p仅适用于批处理文件中的第一行

时间:2016-04-04 09:35:15

标签: windows batch-file

我在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为空?

3 个答案:

答案 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主题。

阅读字符

从输入流中读取字符并将其放入字符缓冲区,直到三个条件之一为真:

  • 条件1:最后2个读取字符是CRLF或LFCR。 (完整的一行)
  • 条件2:char缓冲区中有1023个字符。 (缓冲 全)
  • 条件3:超时,通常由流末尾引起。 (超时错误 - 条件)注意 - 不确定是否确实存在超时条件,陪审团仍然在这个

处理char缓冲区:

  • 将丢弃char-buffer末尾的所有控制字符 (可能的数据丢失)
  • 如果char缓冲区中有NUL字符,那么全部 char缓冲区中第一个NUL后面的字符将是 丢弃(数据丢失)

从char缓冲区移动到Var。

  • 如果char缓冲区为空,则报告错误情况: ...将errorlevel设置为1(表示没有输入值)
  • 如果charbuffer不为空: ...将字符串从char缓冲区移动到set / p命令中指定的变量。

完成SET / P并将控制权返回给批处理文件。

请注意,可以可靠处理的最长行是1021个字节(不包括终止CRLF或LFCR)。