【问题标题】:Why does this piped command fail?为什么这个管道命令会失败?
【发布时间】:2018-02-13 18:43:27
【问题描述】:

存在 %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.

>

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

【问题讨论】:

    标签: cmd windows-7


    【解决方案1】:

    使用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,管道将左侧 process 的 sdtout 连接到右侧 process 的 stdin。虽然不是唯一的解决方案,但它从早期的 unix 版本开始就以这种方式实现,并且它是今天 bash 等 shell 实现它的方式。它有效,但它有一些怪癖有时会咬你。
    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多