假设我们有以下代码片段,文本文件sample.txt
重定向到STDIN
:
@echo off
< "sample.txt" (
set /P "ONE="
set /P "TWO="
findstr /R "^"
)
echo %ONE%, %TWO%
...以及相关文本文件sample.txt
的内容:
first
second
third
fourth
在控制台上返回的输出将是这个,这正是我所期望的(first
消耗的行second
和set /P
,因此findstr
接收并处理剩余的行):
third fourth first, second
当findstr /R "^"
被sort /R
取代时,实现了相同的输出。
但是,当用findstr
或find /V ""
替换more
命令行时,输出将为:
first second third fourth first, second
似乎尽管set /P
已经消耗了最后输出线证明的first
和second
线,但find
和more
仍然接收到整个重定向数据。
为什么会这样,是什么导致这种行为?有没有办法强制find
或more
只接收尚未由前面的命令处理的剩余重定向数据?
(将输出数据STDOUT
重定向到文本文件时的行为是相同的。当在cmd
中直接执行类似于上述批处理代码的命令行时,没有任何更改。)
为什么有些命令会处理已被其他命令消耗的重定向STDIN数据行?
因为一些命令/程序倒带stdin。你可以试试这个:
@echo off
< "sample.txt" (
set /P "ONE="
set /P "TWO="
more +2
)
echo %ONE%, %TWO%
结果:
third
fourth
first, second
more +2
跳过文件的前两行。