是否可以在批处理文件中逐行读取管道?

fth*_*lla 9 cmd batch-file

我想知道是否可以从批处理文件中的管道读取.如果我写:

echo Test
Run Code Online (Sandbox Code Playgroud)

我不明白,Test.真好.但是,如果我想管道输出,并从另一个命令读取它怎么办?

echo Test | echo ???
Run Code Online (Sandbox Code Playgroud)

如何获得与以前相同的结果,但通过管道?谢谢!

编辑:我真正追求的是这个.

我有一个文件列表,我需要在一个名为的文件中逐行删除一些单词filter.txt.所以我必须使用findstr /g:filter.txt.

但后来我需要对匹配的列表文件做一些事情,并且因为findstr每个文件返回一行,我必须逐行读取匹配.

这就是我做到的方式:

dir /b | findstr /g:filter.txt | for /F "delims=" %a in ('more') do del "%a"
Run Code Online (Sandbox Code Playgroud)

解:

看起来我想要做的不是从管道读取而只是在批处理文件中读取另一个命令的输出.

要进行单行读取,您可以使用:

echo Test | ( set /p line= & call echo %%line%%)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用它,也适用于多行输入:

echo Test | for /F "delims=" %a in ('more') do @echo %a
Run Code Online (Sandbox Code Playgroud)

(这种使用更多的技巧在某些情况下可能很有用).但在我的特殊情况下,解决方案是这样的:

for /F "delims=" %a in ('echo Test') do @echo %a
Run Code Online (Sandbox Code Playgroud)

谢谢大家!

fth*_*lla 7

基于这个答案/sf/answers/488642381/看起来像回答我的问题的方法是:

echo Test | for /F "delims=" %a in ('more') do @echo %a
Run Code Online (Sandbox Code Playgroud)

它有点奇怪,但它的工作:)

对我来说这看起来有点奇怪,没有原生解决方案......但这正是我想要的!


jeb*_*jeb 7

对于读取单行,您也可以使用set /p,但这仅适用于一行.

echo test | ( set /p line= & call echo %%line%%)
Run Code Online (Sandbox Code Playgroud)

问题在于,管道为每一侧创建两个新的cmd.exe上下文.
它们与父cmd.exe在同一窗口中运行,它们不能更改父cmd的任何变量,因为它们只是childs.

这就是为什么这个失败的原因

echo test | set /p line=
echo %line%
Run Code Online (Sandbox Code Playgroud)

line 将被设置,但是当管道结束时它将被销毁.


Aac*_*ini 7

对不起,我觉得这里有一个混乱......

你说你想从管道读取.管道用于将一个命令的输出重定向到另一个命令的输入; 第二个命令叫做过滤器.例如,在

dir /b | findstr /g:filter.txt
Run Code Online (Sandbox Code Playgroud)

dirfindstr命令之间有一个管道.始终在两个进程之间建立管道.无法读取从dir命令到findstr命令的数据(这是此处存在的唯一管道).但是,您可以从命令的输出中读取findstr.

如果我们插入一个额外的过滤器,行为是相同的.例如,在

dir /b | findstr /g:filter.txt | more
Run Code Online (Sandbox Code Playgroud)

有两个管道,但没有办法从他们中的任何人读取.但是,您可以从最后一个命令的输出中读取(more在本例中).什么是读取一个命令输出的本机批处理解决方案?它是FOR/F命令.例如,获取echo命令输出的本机方式:

echo Test | for /F "delims=" %a in ('more') do @echo %a
Run Code Online (Sandbox Code Playgroud)

是:

for /F "delims=" %a in ('echo Test') do @echo %a
Run Code Online (Sandbox Code Playgroud)

请注意,在第一个示例中,%a参数不从命令的输出中获取来自管道echofor命令之间的管道的信息.more

以同样的方式,实现这个任务的自然方法:

dir /b | findstr /g:filter.txt | for /F "delims=" %a in ('more') do del "%a"
Run Code Online (Sandbox Code Playgroud)

是这样的:

for /F "delims=" %a in ('dir /b ^| findstr /g:filter.txt') do del "%a"
Run Code Online (Sandbox Code Playgroud)

处理findstr命令的多行输出.

第二种方法不仅比前者更快,而且更清晰,因为包含一个more实际上什么都不做的命令可能会导致意想不到的误解或错误.

安东尼奥