Cmd 为什么这个管道命令会失败?
存在文件%v%.txt时,此批处理文件: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
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今天实现它的方式。它是有效的,但它有一些怪癖,有时会咬你。