【发布时间】:2016-05-24 20:39:10
【问题描述】:
假设我们有以下代码 sn-p 将文本文件 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 时,得到相同的输出。
但是,当用find /V "" 或more 替换findstr 命令行时,输出将是:
first second third fourth first, second
似乎set /P 已经消耗了first 和second 行,这由最后的输出行证明,find 和more 仍然接收到整个重定向数据。
为什么会这样,是什么导致了这种行为?有没有办法强制find 或more 只接收前面命令尚未处理的剩余重定向数据?
(将输出数据STDOUT重定向到文本文件时的行为是相同的。同样当直接在cmd中执行类似于上述批处理代码的命令行时,没有任何变化。)
【问题讨论】:
-
您可能会阅读此行为的描述here,但您的问题的答案是:“因为这样的命令是这样编程的”
-
非常有趣,@Aacini!我已经怀疑
find和more重置了文件指针,因为我玩弄了我提到的所有命令,混合并重新排序它们,我什至在它们周围包裹了一个for /F(比如:for /F "delims=" %%L in ('more') do echo(%%L),这一切都没有改变。所以我担心,似乎没有(本地)方法可以解决这种行为? -
您可以尝试将
findstr /R "^"的结果通过管道传输到find /V ""或more -
好主意,@DennisvanGils,管道允许将
find或more应用于剩余而不是所有数据... -
不幸的是,我刚刚发现
findstr方法挂起,以防sample.txt的最后一行没有被换行符终止;其他命令(sort、find、more)工作正常;所以似乎没有可靠的方法来返回 remaining 行......或者你有什么想法吗?我试图将一个换行符(echo()通过管道传递到括号中的表达式中,但是最后一行丢失了(findstr)...
标签: batch-file cmd io-redirection