首页 > 解决方案 > 为什么 set /p 只从管道中获取 1 行?

问题描述

我试图做类似的事情

type test.txt | multiline.bat

测试.txt

1
2
3

多行.bat

set /p a=a
set /p "b=b"
set /p c=c

(echo %a% %b% %c%)>result.txt
pause

但是 result.txt 留下了

1

当我预料到的时候

1 2 3

我找到了https://stackoverflow.com/a/6980605,上面说

set /p doesn't work with pipes, it takes one (randomly) line from the input.

但为什么??

标签: windowsbatch-filepipestdoutstdin

解决方案


set /p在处理换行符时停止读取输入。这可以通过简单的脚本看到

@echo off
set /p "line=String containing newline:"
echo %line%

然后粘贴字符串

one
two

只会one显示。


如果您知道需要处理多少行,则可以将set /p命令组合在一个代码块中,并将文件重定向到它,如下所示:

(
    set /p "a="
    set /p "b="
    set /p "c="
)<test.txt
(echo %a% %b% %c%)>result.txt

您还可以将输入文件的名称作为参数并在该片段中更改test.txt为。%1


推荐阅读