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

问题描述 投票:7回答:1

假设我们有以下代码片段,文本文件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消耗的行secondset /P,因此findstr接收并处理剩余的行):

third
fourth
first, second

findstr /R "^"sort /R取代时,实现了相同的输出。

但是,当用findstrfind /V ""替换more命令行时,输出将为:

first
second
third
fourth
first, second

似乎尽管set /P已经消耗了最后输出线证明的firstsecond线,但findmore仍然接收到整个重定向数据。

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

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

batch-file cmd io-redirection
1个回答
1
投票

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

因为一些命令/程序倒带stdin。你可以试试这个:

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

结果:

    third
    fourth
    first, second

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

© www.soinside.com 2019 - 2024. All rights reserved.