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



我在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)。

相关内容

最新更新