为什么有些命令会处理已被其他命令消耗的重定向STDIN数据行?

asc*_*pfl 7 cmd batch-file io-redirection

假设我们有以下代码片段,文本文件sample.txt重定向到STDIN:

@echo off
< "sample.txt" (
    set /P "ONE="
    set /P "TWO="
    findstr /R "^"
)
echo %ONE%, %TWO%
Run Code Online (Sandbox Code Playgroud)

...以及相关文本文件的内容sample.txt:

first
second
third
fourth
Run Code Online (Sandbox Code Playgroud)

控制台上返回的输出将是这个,这正是我所期望的(行firstsecond消耗set /P,因此findstr接收和处理剩余的行):

third
fourth
first, second
Run Code Online (Sandbox Code Playgroud)

findstr /R "^"替换为相同的输出sort /R.

但是,当用或替换findstr命令行时,输出将是:find /V ""more

first
second
third
fourth
first, second
Run Code Online (Sandbox Code Playgroud)

这似乎是,虽然set /P已经消耗的线firstsecond由所述最后输出线被证明,find并且也more仍然接收整个重定向数据.

为什么会这样,是什么导致这种行为?有没有办法强制findmore仅接收尚未由前面的命令处理的剩余重定向数据?

(将输出数据重定向STDOUT到文本文件时的行为是相同的.当直接执行类似于上述批处理代码的命令行时cmd,没有任何更改.)

jwd*_*hue 1

为什么某些命令处理已被其他命令使用的重定向 STDIN 数据行?

因为某些命令/程序会倒回标准输入。你可以试试这个:

@echo off
< "sample.txt" (
    set /P "ONE="
    set /P "TWO="
    more +2
)
echo %ONE%, %TWO%
Run Code Online (Sandbox Code Playgroud)

结果:

    third
    fourth
    first, second
Run Code Online (Sandbox Code Playgroud)

跳过more +2文件的前两行。