Cmd 为什么这个管道命令会失败?

Cmd 为什么这个管道命令会失败?,cmd,windows-7,Cmd,Windows 7,存在文件%v%.txt时,此批处理文件: PROMPT $g SET v="d" FOR %%F IN ("*.txt") DO ( TYPE "%%F" ) FOR %%F IN ("*.txt") DO ( SORT "%%F" ) FOR %%F IN ("*.txt") DO ( TYPE "%%F" | SORT ) 产生 >PROMPT $g >SET v="d" >FOR %F IN ("*.txt") DO (TYPE "%F" ) >(T

存在文件%v%.txt时,此批处理文件:

PROMPT $g
SET v="d"
FOR %%F IN ("*.txt") DO ( TYPE "%%F"  )
FOR %%F IN ("*.txt") DO ( SORT "%%F"  )
FOR %%F IN ("*.txt") DO ( TYPE "%%F" | SORT )
产生

>PROMPT $g

>SET v="d"

>FOR %F IN ("*.txt") DO (TYPE "%F"   )

>(TYPE "%v%.txt"   )
content
>FOR %F IN ("*.txt") DO (SORT "%F"   )

>(SORT "%v%.txt"   )
content

>FOR %F IN ("*.txt") DO (TYPE "%F"   | SORT  )

>(TYPE "%v%.txt"   | SORT  )
The system cannot find the file specified.

>

为什么仅从具有管道命令的行中“系统找不到指定的文件”

使用
echo
而不是
type
显示在查找
d.txt
而不是
%v%.txt的最后一个命令中进行了扩展,似乎对具有
的行进行了两次解析

另一个例子:

set a=^%b^%

set b=10

echo %a%

echo %a% | sort

完全正确。首先在运行批处理文件(
%%F->%v%.txt)的
cmd
实例中解析该命令。管道的每一侧都由一个新的独立的
cmd
实例处理,该实例解析(
%v%.txt->“d”.txt
)并执行命令。@MC ND,哇,这太愚蠢了。我想知道这是怎么回事??谢谢。@ChrisJJ,管道将左侧进程的sdtout连接到右侧进程的stdin。虽然不是唯一的解决方案,但从早期的unix版本开始,它就以这种方式实现了,这就是像bash这样的shell今天实现它的方式。它是有效的,但它有一些怪癖,有时会咬你。