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%
...以及相关文本文件的内容sample.txt:
first
second
third
fourth
控制台上返回的输出将是这个,这正是我所期望的(行first和second消耗set /P,因此findstr接收和处理剩余的行):
Run Code Online (Sandbox Code Playgroud)third fourth first, second
findstr /R "^"替换为相同的输出sort /R.
但是,当用或替换findstr命令行时,输出将是:find /V ""more
Run Code Online (Sandbox Code Playgroud)first second third fourth first, second
这似乎是,虽然set /P已经消耗的线first和second由所述最后输出线被证明,find并且也more仍然接收整个重定向数据.
为什么会这样,是什么导致这种行为?有没有办法强制find或more仅接收尚未由前面的命令处理的剩余重定向数据?
(将输出数据重定向STDOUT到文本文件时的行为是相同的.当直接执行类似于上述批处理代码的命令行时cmd,没有任何更改.)
为什么某些命令处理已被其他命令使用的重定向 STDIN 数据行?
因为某些命令/程序会倒回标准输入。你可以试试这个:
@echo off
< "sample.txt" (
    set /P "ONE="
    set /P "TWO="
    more +2
)
echo %ONE%, %TWO%
结果:
    third
    fourth
    first, second
跳过more +2文件的前两行。